【问题标题】:Learning Event handling in Java学习 Java 中的事件处理
【发布时间】:2014-10-10 18:45:32
【问题描述】:

我正在学习使用 Java Swing 类进行事件处理。 我根据新波士顿主页上的教程尝试了不同的组合。我已经创建了一个定义面板、JButtons、JTextfields 和 Jlabels 的类。我创建了一个名为“handler”的类,其中包含 ActionPerfomed 方法,并将两个文本字段(item1 和 item2)连接到 addActionlistener 方法。 当我运行我的程序时,我让程序对两个文本字段执行我想要的操作(这会提示一个 JOptionPane.showMessageDialog 框来显示我想要的文本。

当我希望 JOptionPane.showMessageDialog-window 在我按下其中一个按钮时显示特定文本时,问题就出现了: - 而不是显示以下文本“您按下了 1 号按钮!”正如我希望我的代码那样,而是出现了一个空的 JOptionPane.showMessageDialog-window。

我认为有经验的 Java 程序员会很容易看到我的代码中的错误。

这里是一定是错的部分代码:

private class thehandler implements ActionListener
{
    public void actionPerformed(ActionEvent event)
    {
        String text ="";
        if(event.getSource() == item1)
            text = String.format("You wrote %s in field 1!", event.getActionCommand());
        else if (event.getSource() == item2)
            text = String.format("You wrote %s in field 2!", event.getActionCommand());
        else if (event.getSource() == button1)
            text = "You pushed button number 1!";
        else if (event.getSource() == button2)
            text = "You pushed button number 2!";

        JOptionPane.showMessageDialog(null, text);

【问题讨论】:

  • 弹出对话框说明ActionListener被触发了。由于它显示的是一个空字符串,因此事件的来源很可能不是您所期望的。
  • 考虑发布MCVE。您确定 item1、item2、button1 和 button2 已正确初始化吗?

标签: java swing event-handling action actionlistener


【解决方案1】:
package EventHandling;

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

public class EventHandling
{
     JLabel jlab;
    public EventHandling()
    {

        JFrame jfrm = new JFrame("Event Handling");
        jfrm.setSize(220,90);
        jfrm.setLayout(new FlowLayout());
        jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JButton alpha = new JButton("Alpha");
        JButton beta= new JButton("Beta");
        alpha.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                jlab.setText("Alpha was pressed.");
            }
        }
        );

        beta.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                jlab.setText("Beta was pressed.");
            }
        }
        );
        jfrm.add(alpha);
        jfrm.add(beta);
        jlab = new JLabel("Press a button");
        jfrm.add(jlab);
        jfrm.setVisible(true);
    }

        public static void main(String[]args)
        {
            SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {
                    new EventHandling();
                }
            }
            );
        }


}

此程序将在 JLabel 中打印您按下的按钮。

【讨论】:

  • 请考虑添加一些关于您所做的事情和原因的解释。
【解决方案2】:

在调用 JOptionPane 之前添加 System.out.println()

System.out.println("text=" + text);
JOptionPane.showMessageDialog(null, text);

我打赌你会发现text 是一个空字符串。为什么?也许您的对象引用为空。

另一种可以解决您的问题且不依赖对象引用的方法是使用操作命令:

button1.setActionCommand("doAction1");

public void actionPerformed(ActionEvent event) {
    String actionCommand = event.getActionCommand();

    if (actionCommand.equals("doAction1")) {
        // button 1 pressed
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 2021-12-06
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多