需要JButton事件的支持

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

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

例如:用户按下登录 – > if(textfield1.getText()==“user”){打开另一个JFrame} – >等。

这是我的主要代码:

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

这是Login类:

 /* * 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") //  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)) ); }//  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”)时,它确实有效。 但是现在我需要它来处理Login框架并访问main.java中的另一个方法。 我怎样才能从Login.java中的私有方法中实现这一点?

提前致谢,

但是现在我需要它来处理Login框架并访问main.java中的另一个方法。 我怎样才能从Login.java中的私有方法中实现这一点?

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

注意:尽量避免使用NetBeans GUI Builder(或任何GUI构建器)。 这很容易,但是你想要做很多事情而不是自己动手做。 你甚至可以写一个更干净的代码。 但是有必要了解布局管理器

代码示例:此示例说明了您可以使用少于一半的代码行来实现相同的function。

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

我从来没有见过有人为之前的按钮指定一个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"); } } 

我想这就是你要找的……