我正在嘗試制作一個簡單的 java 程式來保存 20 個學生的資料,即名字、姓氏、哪個學期和電子郵件,并制作 2 個按鈕來保存資料,然后再制作一個按鈕來列印所有資料。
我的主要問題是如何弄清楚使用我的動作監聽器。
首先我做了學生課:
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Scanner;
public class student {
static Scanner scr = new Scanner(System.in);
String [] [] student = new String[20][5];
private String fornamn;
private String efternamn;
private String termin;
private String username;
private String epost;
Calendar calendarObj = GregorianCalendar.getInstance();
int month = calendarObj.get(Calendar.MONTH);
int year = calendarObj.get(Calendar.YEAR);
public student(String fornamn, String efternamn){ //constructor takes f,e
this.fornamn = fornamn;
this.efternamn = efternamn;
}
public student(){ // default constructor
}
public void setFornamn(String fornamn ) {
this.fornamn = fornamn;
}
public void setEfternamn (String efternamn ) {
this.efternamn= efternamn;
}
public String getFornamn(){
return fornamn;
}
public String getEfternamn(){
return efternamn;
}
public String getTermin(){
return termin;
}
public void setTermin(String termin) {
this.termin = termin;
}
public String getUsername(){
return username;
}
public void setUsername(String username) {
this.username = username ;
}
public void setEpost(String epost) {
this.epost = epost;
}
public String getEpost() { return epost;}
int i = 0;
public String skapaTermin() {
if (month < 6){
termin = "ht";
} else {
termin = "vt";
}
return termin;
}
public String skapaUser() {
username = termin fornamn.substring(0,3) efternamn.substring(0,3);
return skapaUser();
}
public String skapaEpost(){
epost = username "@du.se";
return skapaEpost();
}
}
第二我做了這個GUI:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class mysubclass implements ActionListener{
static student obj = new student ();
JTextField tfFornamn;
JLabel lblFornamn;
JTextField tfEfternamn;
JLabel lblEfternamn;
JTextField tfTermin;
JLabel lblTermin;
JTextField tfUsername;
JLabel lblUsername;
JTextField tfEpost;
JLabel lblEpost;
JButton spara ;
JTextField btnSpara ;
JButton visaalia ;
mysubclass() {
JFrame frame = new JFrame("student form");
JPanel panel = new JPanel();
frame.setSize(400,350);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(panel);
panel.setLayout(null);
JLabel lblFornamn = new JLabel("F?rnamn :"); //First name
lblFornamn.setBounds(10,10,80,35);
panel.add(lblFornamn);
JTextField tfFornamn = new JTextField(25); //textfield for first name
tfFornamn.setBounds(120,10,600,30);
panel.add(tfFornamn);
JLabel efternamn = new JLabel("Efternamn :"); //last name
efternamn.setBounds(10,50,90,35);
panel.add(efternamn);
JTextField tfEfternamn = new JTextField(25); // textfield for last name
tfEfternamn.setBounds(120,50,600,30);
panel.add(tfEfternamn);
JLabel lblTermin = new JLabel("Termin :"); //termin
lblTermin.setBounds(10,90,90,35);
panel.add(lblTermin);
JTextField tfTermin = new JTextField(25); //textfield termin
tfTermin.setBounds(120,90,600,30);
panel.add(tfTermin);
JLabel lblUsername = new JLabel("Username :"); // username
lblUsername.setBounds(10,130,90,35);
panel.add(lblUsername);
JTextField tfUsername = new JTextField(25); //textfield username
tfUsername.setBounds(120,130,600,30);
panel.add(tfUsername);
JLabel lblEpost = new JLabel("Epost :"); //email
lblEpost.setBounds(10,170,90,35);
panel.add(lblEpost);
JTextField tfEpost = new JTextField(25); //textfield email
tfEpost.setBounds(120,170,600,30);
panel.add(tfEpost);
JButton spara = new JButton("Save");
spara.setBounds(10,210,120,30);
panel.add(spara);
spara.addActionListener(this);
JTextField btnSpara = new JTextField(25); //textfield save button
btnSpara.setBounds(150,210,600,130);
panel.add(btnSpara);
JButton visaalia = new JButton("show all");
visaalia.setBounds(10,280,120,30);
panel.add(visaalia);
visaalia.addActionListener(this);
frame.setResizable(true);
frame.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == spara) {
obj.setFornamn(tfFornamn.getText()); //encapsulation
obj.setEfternamn(tfEfternamn.getText());
obj.setTermin(tfTermin.getText());
obj.setUsername(tfUsername.getText());
obj.setEpost(tfEpost.getText());
for(int i = 0 ; i <= obj.student.length;i ) {
obj.student [i][0] = obj.getFornamn();
obj.student [i][1] = obj.getEfternamn();
obj.student [i][2] = obj.getTermin();
obj.student [i][3] = obj.getUsername();
obj.student [i][4] = obj.getEpost();
}
}
if(e.getSource() == visaalia) {
for(int i = 0 ; i <= obj.student.length;i ) {
System.out.println("hi");
}
}
}
}
然后我就叫它:
public class Main {
public static void main(String[] args) {
new mysubclass ();
}
}
uj5u.com熱心網友回復:
第一個問題是,你正在隱藏你的變數。
也就是說,您已將spara和宣告visaalia為類的實體欄位,但隨后在建構式中將它們重新宣告為區域變數...
class mysubclass implements ActionListener {
//...
JButton spara;
JButton visaalia;
//...
mysubclass() {
//...
// Re-declared here as local variable
JButton spara = new JButton("Save");
//...
// Re-declared here as local variable
JButton visaalia = new JButton("show all");
//...
這意味著何時actionPerformed被呼叫,spara并且visaalia兩者都是null
現在,房間里的大象
你不需要static Scanner scr = new Scanner(System.in);,去掉它,在使用GUI的時候,這種說法只是嚇唬人
你不應該使用Calendar. 它已被有效地棄用并已被java.time.*API 取代,是時候繼續前進并學習應該如何完成它了。
你真的需要花時間學習如何使用布局管理器。 null布局只會在您面前爆炸,當我運行您的代碼時,組件不適合視窗,使您的界面無用。
你真的需要花時間看看:
- 在容器中布置組件
- 日期/時間軌跡
uj5u.com熱心網友回復:
問題是您沒有檢查是否已經存在具有相同術語的用戶名。例如,如果陣列中的第一行是“nt01, Tobi, Gr?ndahl, nt01, [email protected]”,當您按下“保存”時,程式將嘗試保存另一個用戶名為“nt01”的學生。但是您可能已經意識到,陣列中已經有一個用戶名為“nt01”的學生。原因是您使用相同的變數來存盤用戶名和終端。我能想到的最簡單的解決方案是更改其中一個變數名。您可以使用“user_name”而不是“username”。或者,您可以創建另一個變數來存盤所有用戶名,并檢查是否已經存在具有此用戶名的條目。如果有,請不要保存新條目。為了列印所有學生,您必須創建一個單獨的函式來回圈整個陣列并列印每個學生。問題是您已經使用“student_array”作為存盤學生陣列的變數,并且您想用它來列印所有學生。所以你必須重命名變數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/422245.html
標籤:
