当前位置: 首页 > 知识库问答 >
问题:

我不能使用actionPerformed()方法处理一个JButton click事件,不要在方法中输入,为什么?

孔驰
2023-03-14

我是Java Swing的新手,在尝试使用ActionPerformed方法处理按钮上的click事件时遇到了一些问题,如文档http://docs.oracle.com/javase/tutorial/uiswing/components/button.html#abstractButton

package com.test.login;

import javax.swing.JButton;

import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.io.IOException;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPopupMenu.Separator;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;

import net.miginfocom.swt.MigLayout;

import org.jdesktop.application.SingleFrameApplication;

public class LoginFrame extends SingleFrameApplication {

    private static final int FIXED_WIDTH = 550;
    private static final Dimension INITAL_SIZE = new Dimension(FIXED_WIDTH, 230);

    private boolean loginResult = true;

    /*
    public static void main(String[] args) {
        System.out.println("DENTRO: LoginFrame() ---> main()");
        launch(LoginFrame.class, args);
    }
    */

    @Override
    protected void startup() {
        // TODO Auto-generated method stub
        System.out.println("Inside LoginFrame ---> startup()");


        JFrame loginFrame = this.getMainFrame();            // main JFrame that represents the Windows
        loginFrame.setTitle("XCloud Login");

        loginFrame.setPreferredSize(INITAL_SIZE);
        loginFrame.setResizable(false);

        Container mainContainer = loginFrame.getContentPane();      // main Container into the main JFrame


        // JPanel creation and settings of the MigLayout on it:
        // JPanel externalPanel = new JPanel();
        JPanelWithBackground externalPanel = null;

        try {
            externalPanel = new JPanelWithBackground("resources/logo.png");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        externalPanel.setLayout(new net.miginfocom.swing.MigLayout("fill"));

        externalPanel.add(new JLabel("Username"), "w 50%, wrap");

        JTextField userNameTextField = new JTextField(20);

        externalPanel.add(userNameTextField, "w 90%, wrap");

        externalPanel.add(new JLabel("Password"), "w 50%, wrap");
        JTextField pswdTextField = new JTextField(20);
        externalPanel.add(pswdTextField, "w 90%, wrap");

        JButton loginButton = new JButton("Login");
        loginButton.setActionCommand("loginAction");

        externalPanel.add(loginButton, "w 25%, wrap");

        mainContainer.add(externalPanel);
        //mainFrame.add(mainContainer);

        show(loginFrame);


    }

    // Operation performed when the loginButton is clicked:
    public void actionPerformed(ActionEvent e) {
        System.out.println("Inside LoginFrame ---> actionPerformed()");
        if ("loginAction".equals(e.getActionCommand())) {
            System.out.println("loginButton clcked !!!");

        }
    }

}

正如您在这个类中所看到的,我有一个名为loginButton的JButton,并且在这个对象上设置了一个ActionCommand,如下所示:

JButton loginButton = new JButton("Login");
loginButton.setActionCommand("loginAction");

然后创建了以下必须处理此事件的actionPerformed:

// Operation performed when the loginButton is clicked:
public void actionPerformed(ActionEvent e) {
    System.out.println("Inside LoginFrame ---> actionPerformed()");
    if ("loginAction".equals(e.getActionCommand())) {
        System.out.println("loginButton clcked !!!");

    }
}

因此,该方法将ActionCommand放在事件中,如果它等于loginAction,则打印一条消息。

安德里亚

共有1个答案

辛可人
2023-03-14

您忘记将操作侦听器添加到按钮。在startup()中添加下面的代码,它将正常工作。

 loginButton.addActionListener(this);

还要将implements ActionListener声明添加到类中。

public class LoginFrame extends SingleFrameApplication implements ActionListener{..
 类似资料:
  • 问题内容: 我在Java中为simpleGUI编写了一个小代码。 我是JAVA的新手。与此程序相关的问题很少。 有人可以解释一下actionPerformed方法如何在没有任何调用的情况下执行吗? 在这里,我在go()方法的本地定义了框架对象,我们在actionPerformed中使用了按钮,这是另一种方法,那怎么可能呢?按钮没有嵌入框架吗? 谢谢.. 问题答案: 有人可以解释一下actionPe

  • 我不明白这一点: 没有这个,我可以做到: 为什么在第一种情况下我不能调用hello()方法,而在第二种情况下我可以调用?

  • 问题内容: 我喜欢在这里使用这种方法: 唯一的缺点(例如,与Google Guava相比)是无法静态导入该方法。也就是说,这是没有用的: …因为我的Eclipse编译器在编写时无法正确链接该方法 错误是: Object类型中的equals(Object)方法不适用于参数(…,…) 这是为什么?如果在任何超级类型中都存在具有相同名称(但签名不相同)的方法,我的静态导入方法是否不适用?这是JLS中正式

  • 问题内容: 下面的代码 在Python 2中可以正常工作,但是在Python 3中我得到一个错误: 它仅适用于和。 问题答案: 您需要提供在Python 3订货丰富的比较方法,这是 ,,,,,和。另请参阅:PEP 207-丰富的比较 。 是 不是 不再使用。 更具体地说,以和作为参数,并且需要返回是否小于。例如: (这不是明智的比较实现,但是很难说出您要做什么。) 因此,如果您有以下情况: 这等效

  • 我知道string1将包含一个空字符串。我的问题是为什么像下面这样两次调用nextLine方法会出现错误: