【问题标题】:Need support with JButton events需要 JButton 事件的支持
【发布时间】:2013-10-18 18:45:57
【问题描述】:

我最近回答了一个关于如何在另一个类的主方法中打开登录面板的问题。 因为我还没有上过任何 Swing 课程(只有基本的 Java 编程),所以我已经偶然发现了另一个问题。

我如何检测用户是否按下了 JPanel 中的按钮并使其执行某些操作。

例如: 用户按下登录 -> if (textfield1.getText() == "user"){ open another JFrame } -> etc.

这是我的主要代码:

import java.awt.*;
import javax.swing.*;

public class Corendon {

    public static void main(String[] args) {
           showLogin();
    }

    private static void showLogin(){
        Login login = new Login();

        JFrame loginFrame = new JFrame();
        loginFrame.add(login);
        loginFrame.pack();
        loginFrame.setLocationRelativeTo(null);
        loginFrame.setVisible(true);
        loginFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }
}

这里是登录类:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Daan
 */
public class Login extends javax.swing.JPanel {

    /**
     * Creates new form Login
     */
    public Login() {
        initComponents();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNINGds: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jPasswordField1 = new javax.swing.JPasswordField();
        jTextField1 = new javax.swing.JTextField();
        jComboBox1 = new javax.swing.JComboBox();
        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();

        jLabel1.setIcon(new javax.swing.ImageIcon("C:\\Users\\Daan\\Dropbox\\HvA\\Programming\\Corendon\\corendon.png")); // NOI18N

        jLabel2.setText("Username");

        jLabel3.setText("Password");

        jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Dutch", "English" }));

        jButton1.setText("Login");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jButton2.setText("Cancel");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                        .addGap(31, 31, 31)
                        .addComponent(jLabel1))
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                        .addGap(45, 45, 45)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel2)
                            .addComponent(jLabel3)
                            .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(14, 14, 14)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(layout.createSequentialGroup()
                                .addGap(29, 29, 29)
                                .addComponent(jButton2)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(jButton1))
                            .addComponent(jPasswordField1, javax.swing.GroupLayout.PREFERRED_SIZE, 214, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 214, javax.swing.GroupLayout.PREFERRED_SIZE))))
                .addContainerGap(22, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap(16, Short.MAX_VALUE)
                .addComponent(jLabel1)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel2)
                    .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jPasswordField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel3))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButton2)
                    .addComponent(jButton1))
                .addGap(35, 35, 35))
        );
    }// </editor-fold>                        

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         

    }                                        

    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JComboBox jComboBox1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JPasswordField jPasswordField1;
    private javax.swing.JTextField jTextField1;
    // End of variables declaration                   


}

所以我尝试在 Login.java 内部工作并使用作为事件处理程序的私有方法。我做了这样的事情:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    String user = jTextField1.getText();
    if(user == "user")  {
         jTextField1.setText("LOL");
    }
}  

只是为了测试它是否真的做了我想要的,但是当我按下按钮时它什么也没做。之后,我尝试在我的 main.java 中解决它,我实际上在其中创建了带有 JPanel 的框架。在阅读了很多教程之后,这些教程总是在同一个 java 文件中创建 JPanel 和 JButton 等(在我的例子中是 main.java)。

那么我如何检测登录按钮是否被按下,然后让它处理 JFrame 并转移到另一个方法,在该方法中我创建另一个 JFrame,其中包含信息。

我希望我足够清楚,如果没有,请告诉我。

编辑: 当我将测试代码更改为: user.equals("user") 它确实有效。但现在我需要它来处理登录框架并访问我的 main.java 中的另一个方法。如何从 Login.java 的私有方法中实现这一点?

提前致谢,

【问题讨论】:

  • if(user == "user") 不要将字符串的值与== 进行比较,而是使用equals 方法如if(user.equals("user")) 或更好地防止NPE 如果user 将是null 从字符串文字开始if("user".equals(user)).
  • 您在事件处理程序中是否尝试过:“if(user.equals("user"))”?
  • 哦,我应该知道的那部分是对的。我马上编辑。

标签: java swing


【解决方案1】:

但现在我需要它来处理登录框架并访问另一个方法 在我的 main.java 中。我如何从私有方法中实现这一点 在 Login.java 中?

这里你有一个设计问题。您不能调用任何框架的方法,因为您的ActionListener 的范围仅限于Login 面板。如何解决这个问题?实现一个ActionListener,该ActionListener 具有足够的可见性来处理框架。

注意:尽量避免使用 NetBeans GUI Builder(或任何 GUI builder)。这很容易,但您会错过很多事情,而不是自己动手制作。您甚至可以编写更简洁的代码。但是有必要了解Layout Managers

代码示例:此示例说明了您可以用不到一半的代码行来实现相同的目标。

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class Demo {    

    private void initGUI(){        

        final JTextField textField = new JTextField(20);
        final JFrame frame = new JFrame("Login");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);        

        JButton button = new JButton("Accept");        
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if("user".equals(textField.getText())){
                    frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));
                    // or simply frame.dispose()
                } else {
                    JOptionPane.showMessageDialog(null, "Wrong user! Keep trying.", "Login failed", JOptionPane.WARNING_MESSAGE);
                }
            }
        });

        JPanel login = new JPanel(new FlowLayout());
        login.add(new JLabel("User"));
        login.add(textField);
        login.add(button);

        frame.getContentPane().add(login);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }    

    public static void main(String[] args) {        
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Demo().initGUI();
            }
        });
    }
}

【讨论】:

    【解决方案2】:

    我以前从未见过有人为按钮指定一个 ActionListener 像这样.. 通常你会做两件事之一(AFAIK):

    在包含您希望使用的 JButton 的类中实现 ActionListener,然后 JButton.addActionListener(this) 告诉按钮将此类用作ActionListener。您的 actionPerformed(ActionEvent e) 方法将执行您希望按钮执行的操作。

    创建一个实现ActionListener 类的新类,并将其作为actionListener 添加到JButton。

    例子:

    public class Example1 extends JFrame implements ActionListener
    {
        JButton button1;
        JTextField field1;
    
        public Example1()
        {
            super();
            button1 = new JButton("Login");
            button1.addActionListener(this);
    
            field1 = new JTextField();
    
            add(button1);
            add(field1);
    
        }
    
        @Override
        public void actionPerformed(ActionEvent e)
        {
            if(e.getActionCommand().equals("Login")) //for use with multiple buttons, there are other ways to do this
                field1.setText("LOL");
        }
    
    }
    

    我想这就是你要找的东西..

    【讨论】:

    • ActionListeners 的匿名内部类是惯用的 Java 方法。使包含类实现ActionListener 并传递this 是不好的设计,并且在不需要单独的命名类的情况下,侦听器可能足够轻量级。
    猜你喜欢
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-22
    相关资源
    最近更新 更多