1

I've recently had a question answered about how to open a login panel in my main method in another class. Because i have not yet had any lessons in Swing yet (only basic Java Programming) i have already stumbled upon another question.

How can i detect if a user has pressed a button in the JPanel and make it do something.

For example: User pressed login -> if (textfield1.getText() == "user"){ open another JFrame } -> etc.

Here is my main code:

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);

    }
}

Here is the Login class:

/*
 * 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                   


}

So i tried working inside the Login.java and use the private method which is an event-handler. I made it something like:

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

Just to test if it actually even did what i wanted, but when i pressed the button it didn't do anything. After that i tried working it out in my main.java where i actually created the frame with the JPanel in it. After reading alot of tutorials, which always created the JPanel and JButton etc. all in the same java file (which is in my case the main.java).

So how do i detect if the login button was pressed, and then make it dispose of the JFrame and move on to another Method in which i create another JFrame with information in it.

I hope i am clear enough, if not please let me know.

EDIT: When i changed the test code to: user.equals("user") it did work. But now i need it to dispose the Login frame and access another method in my main.java. How can i achieve this from inside a private method in the Login.java?

Thanks in advance,

4

2 回答 2

3

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

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

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

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

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();
            }
        });
    }
}
于 2013-10-18T20:55:54.727 回答
-1

我从来没有见过有人像以前那样为按钮指定 ActionListener。通常你会做两件事之一(AFAIK):

ActionListener在包含 JButton您希望使用的类中实现,然后 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");
    }

}

我想这就是你要找的..

于 2013-10-18T19:53:32.930 回答