我最近一直在使用JFrame,並在簡單的登錄,註冊和彈出框架工作,當我有他們在一個類。我想讓它更好,並且不是所有的內容都包裝在一個類中,所以我爲框架,按鈕,面板,變量和主類做了一個類。我的問題是,框架本身工作正常,加載和顯示,但按鈕上的ActionListeners根本不工作。當我點擊一個按鈕時,沒有什麼變化。我對Java相當陌生,對JFrames和JButtons來說也很新。有什麼我可以做的,使這個更簡單,或讓我的代碼看起來更好?代碼將在每一個單獨的類:Java Action不同類的監聽器無法正常工作
現在沒有任何運行,即使是「This is running」在它應該調用LoginScreen()不運行之前。我不確定我爲了做到這一點而改變了什麼?
主類:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import static javax.swing.WindowConstants.DISPOSE_ON_CLOSE;
public class myGame {
public static void main(String[] args){
buttons myButtons = new buttons();
frames myFrames = new frames();
panels myPanels = new panels();
variables myVariables = new variables();
System.out.println("This is running");
myFrames.loginScreenFrame();
System.out.println("This is also running"); }
}
幀類:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import static javax.swing.WindowConstants.DISPOSE_ON_CLOSE;
public class frames{
public JFrame loginScreenFrame(){
variables myVariables = new variables();
panels myPanels = new panels();
buttons myButtons = new buttons();
myVariables.loginFrame.setSize(300,125);
myVariables.loginFrame.setLocation(550,250);
myVariables.loginFrame.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
Container content = myVariables.loginFrame.getContentPane();
content.add(myPanels.loginScreenPanel(), BorderLayout.CENTER);
content.add(myPanels.loginScreenButtonsPanel(), BorderLayout.SOUTH);
myButtons.registerButton.addActionListener(myButtons.registerListener);
myVariables.loginFrame.setVisible(true);
return myVariables.loginFrame;
}
public JFrame registerFrame(){
variables myVariables = new variables();
panels myPanels = new panels();
myVariables.registerFrame.setSize(400,125);
myVariables.registerFrame.setLocation(550,250);
myVariables.registerFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container content = myVariables.registerFrame.getContentPane();
content.add(myPanels.registerScreenPanel(), BorderLayout.CENTER);
content.add(myPanels.registerScreenButtonsPanel(), BorderLayout.SOUTH);
myVariables.registerFrame.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
myVariables.registerFrame.setVisible(true);
return myVariables.registerFrame;
}
}
按鈕類別:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import static javax.swing.WindowConstants.DISPOSE_ON_CLOSE;
public class buttons{
JButton loginButton = new JButton("Login");
JButton registerButton = new JButton("Register");
JButton cancelButton = new JButton("Cancel");
JButton checkUsernameButton = new JButton("Check Username");
public void actionListeners(){
variables myVariables = new variables();
frames myFrames = new frames();
panels myPanels = new panels();
ActionListener cancelListener = new ActionListener(){
public void actionPerformed(ActionEvent ae){
frames myFrames = new frames();
myFrames.registerFrame().dispose();
}
};
ActionListener usernameListener = new ActionListener(){
public void actionPerformed(ActionEvent ae){
}
};
ActionListener passwordListener = new ActionListener(){
public void actionPerformed(ActionEvent ae){
}
};
ActionListener passwordCheckListener = new ActionListener(){
public void actionPerformed(ActionEvent ae){
}
};
ActionListener checkUsernameListener = new ActionListener(){
public void actionPerformed(ActionEvent ae){
variables myVariables = new variables();
if (myVariables.usernameAndPassword.get(myVariables.username) == null){
JPanel okButtonPanel = new JPanel();
final JFrame invalidUsernameFrame = new JFrame();
invalidUsernameFrame.setSize(400,75);
invalidUsernameFrame.setLocation(550,250);
JButton okButton = new JButton("Ok");
Container invalidUsernameContainer = invalidUsernameFrame.getContentPane();
okButtonPanel.add(okButton);
JLabel invalidUsernameLabel = new JLabel();
invalidUsernameLabel.setText(" Username is Available!");
invalidUsernameContainer.add(invalidUsernameLabel);
invalidUsernameContainer.add(okButtonPanel, BorderLayout.SOUTH);
invalidUsernameFrame.setVisible(true);
ActionListener okListener = new ActionListener(){
public void actionPerformed(ActionEvent ae){
myGame mainClass = new myGame();
invalidUsernameFrame.dispose();
}
};
okButton.addActionListener(okListener);
}
else{
JPanel okButtonPanel = new JPanel();
final JFrame invalidUsernameFrame = new JFrame();
invalidUsernameFrame.setSize(400,75);
invalidUsernameFrame.setLocation(550,250);
JButton okButton = new JButton("Ok");
Container invalidUsernameContainer = invalidUsernameFrame.getContentPane();
okButtonPanel.add(okButton);
JLabel invalidUsernameLabel = new JLabel();
invalidUsernameLabel.setText(" Username is not Available");
invalidUsernameContainer.add(invalidUsernameLabel);
invalidUsernameContainer.add(okButtonPanel, BorderLayout.SOUTH);
invalidUsernameFrame.setVisible(true);
ActionListener okListener = new ActionListener(){
public void actionPerformed(ActionEvent ae){
myGame mainClass = new myGame();
invalidUsernameFrame.dispose();
}
};
okButton.addActionListener(okListener);
}
}
};
ActionListener registerListener = new ActionListener(){
public void actionPerformed(ActionEvent ae){
frames myFrames = new frames();
myFrames.registerFrame();
}
};
cancelButton.addActionListener(cancelListener);
myVariables.usernameField.addActionListener(usernameListener);
myVariables.passwordField.addActionListener(passwordListener);
myVariables.passwordCheckField.addActionListener(passwordCheckListener);
registerButton.addActionListener(registerListener);
checkUsernameButton.addActionListener(checkUsernameListener);
}
}
面板類:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class panels{
buttons myButtons = new buttons();
frames myFrames = new frames();
variables myVariables = new variables();
public JPanel loginScreenPanel(){
buttons myButtons = new buttons();
frames myFrames = new frames();
variables myVariables = new variables();
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(2,2));
panel.add(new JLabel("Username:"));
panel.add(myVariables.usernameFrame);
panel.add(new JLabel("Password:"));
panel.add(myVariables.passwordFrame);
return panel;
}
public JPanel loginScreenButtonsPanel(){
JPanel buttons = new JPanel();
buttons.add(myButtons.loginButton);
buttons.add(myButtons.registerButton);
buttons.add(myButtons.cancelButton);
return buttons;
}
public JPanel registerScreenPanel(){
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(3,2));
panel.add(new JLabel("Username:"));
panel.add(myVariables.usernameField);
panel.add(new JLabel("Password:"));
panel.add(myVariables.passwordField);
panel.add(new JLabel("Re-Enter Password:"));
panel.add(myVariables.passwordCheckField);
return panel;
}
public JPanel registerScreenButtonsPanel(){
JPanel buttons = new JPanel();
buttons.add(myButtons.registerButton);
buttons.add(myButtons.checkUsernameButton);
buttons.add(myButtons.cancelButton);
return buttons;
}
}
新代碼:
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class ExampleGame {
java.util.HashMap<String,char[]> usernamesAndPasswords = new java.util.HashMap<String,char[]>();
public static void main(String[] args) {
new ExampleGame();
}
public ExampleGame() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
LoginPane pane = new LoginPane();
storeInfo info = new storeInfo();
int result = JOptionPane.showOptionDialog(null, pane, "Login", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, null, new String[]{"Login", "Cancel"}, 0);
if (result == 0) {
User user = pane.getUser();
// Perform the login...
usernamesAndPasswords = info.storeInfo(user.name, user.password, usernamesAndPasswords);
System.out.println("Name entered: " + user.name);
System.out.print("Password entered: ");
System.out.println(user.password);
System.out.println(usernamesAndPasswords.get(user.name));
}
}
});
}
public class LoginPane extends JPanel {
private JTextField userName;
private JPasswordField password;
public LoginPane() {
userName = new JTextField(10);
password = new JPasswordField(10);
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.insets = new Insets(4, 4, 4, 4);
gbc.anchor = GridBagConstraints.EAST;
add(new JLabel("Username:"), gbc);
gbc.gridx++;
gbc.fill = GridBagConstraints.HORIZONTAL;
add(userName, gbc);
gbc.gridx = 0;
gbc.gridy++;
gbc.fill = GridBagConstraints.NONE;
add(new JLabel("Password:"), gbc);
gbc.gridx++;
gbc.fill = GridBagConstraints.HORIZONTAL;
add(password, gbc);
}
public User getUser() {
return new User(userName.getText(), password.getPassword());
}
}
public class User {
private String name;
private char[] password;
public User(String name, char[] password) {
this.name = name;
this.password = password;
}
}
public class storeInfo{
public java.util.HashMap storeInfo(String name, char[] password, java.util.HashMap <String, char[]> usernamesAndPasswords){
usernamesAndPasswords.put(name, password);
return usernamesAndPasswords;
}
}
}
我添加了一個類的實例來得到它的值存儲在一個HashMap,我想知道如果我這樣做是正確的,或者有其他更好如何做到這一點?現在它將值存儲在HashMap中,但它給了我一個警告:注意:ExampleGame.java使用未經檢查或不安全的操作。 注意:使用-Xlint重新編譯:取消選中以獲取詳細信息。
我讀到了你給的鏈接,其中一些沒有意義,但我認爲它大部分都是。就在我開始嘗試讓這個工作之前,我想確保我做到了這個HashMap的權利。
我也有你的許可使用你所做的代碼嗎?我可以自己做類似的東西,但它可能不會很好,很乾淨。
你讓創建的具有相互沒有關係的變量實例。例如,在你的關閉動作偵聽器中,你創建了另一個'frames'實例,它不是屏幕上的實例。 – MadProgrammer
你是指取消聽衆嗎?我有:框架myFrames =新框架()?這裏我只是打電話給我已經做的那個。我不確定你的意思。你可以說得更詳細點嗎? – Molten
在'buttons'類中,在'actionListeners'中創建了3個'myFrames'的新實例,其中沒有任何實例具有任何實際在屏幕上的內容。它總共你做6次... – MadProgrammer