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

使用JButton时如何重用actionListener的按键方法?

景温书
2023-03-14

我正在用Java创建一个计算器GUI应用程序。我已经实现了用鼠标按下按钮的计算器。我也想听听numpad Press的数字,但我不想在ActionListener中重新创建方法

例如,当按下JButton时,我就是这样实现listenOne的。

class ListentoOne implements ActionListener{
        public void actionPerformed(ActionEvent arg) {

            if(floating)
                aftDec+="1";

            else if(!operanD)
                ans=(ans*10)+1;

            else
            operand=(operand*10)+1;

            screen.setText(output+="1");

            }
}

在panel类的构造函数中,我以这种方式构造了JButton:

one=new JButton("1");
one.addActionListener(new ListentoOne());

共有3个答案

轩辕阳焱
2023-03-14

查看计算器面板示例。

它展示了如何为所有按钮共享一个ActionListener。该示例还使用键绑定,以便您可以单击按钮或键入按钮上显示的数字来调用该操作。

戚澄邈
2023-03-14
for(ActionListener a: button.getActionListeners()) {
    a.actionPerformed(yourActionEvent);
}
马冯浩
2023-03-14

我会为此使用键绑定,而不是keylister。当然,有多种方法可以通过键绑定实现这一点,但在我的示例中,我创建了一个新类,如果按1,它只需在按钮上调用doClick()

import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.KeyStroke;

public class Example {

    public Example() {

        JLabel label = new JLabel("0");
        ShortCutButton button = new ShortCutButton("1", KeyStroke.getKeyStroke(KeyEvent.VK_1, 0));
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                label.setText(String.valueOf(Integer.parseInt(label.getText()) + 1));
            }
        });
        JFrame frame = new JFrame();
        frame.setLayout(new FlowLayout());
        frame.add(button);
        frame.add(label);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);

    }

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

    public class ShortCutButton extends JButton {
        public ShortCutButton(String text, KeyStroke keyStroke) {
            setText(text);
            getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(keyStroke, "42");
            getActionMap().put("42", new AbstractAction() {
                @Override
                public void actionPerformed(ActionEvent arg0) {
                    doClick();
                }
            });
        }
    }

}
 类似资料:
  • 我正在编写一个Java应用程序。我有多个按钮。每个按钮的代码完全相同,因此我只需要一个ActionListener。但是在这个ActionListener中,我需要为相应的按钮调用“setText()”。这可能吗?我将如何实现这一点? 我尝试了以下方法: 但这不起作用——它说“找不到符号”。 提前感谢;)

  • 问题内容: 我有一个JButton,想捕获鼠标单击它。在JButton上使用ActionListener与使用MouseListener之间有什么实际和哲学上的区别? 问题答案: ActionListener用于处理按钮的逻辑单击。点击发生 当按下鼠标然后释放按钮时, 或使用该按钮的键盘快捷键时, 或当按钮具有焦点并按下空格键时, 或当按钮为默认按钮并按下Enter键时, 或以编程方式调用按钮的c

  • 问题内容: 我正在使用MVC创建一个基本的计算器。到目前为止,我正在改编一个教程,该教程仅将两个用户输入的值加在一起。 目前,我要添加到视图中的每个按钮都有其自己的侦听器,可以。但是,根据教程的控制器每个按钮只有一个ActionListener内部类。这重复了大量代码。 如何为所有按下的按钮创建一个ActionListener类,并在按下的按钮的ID上使用case语句? 在视图中注册oneButt

  • 问题内容: 如何将动作侦听器添加到这些按钮,以便可以从主要方法调用actionperformed它们,因此单击它们时可以在程序中调用它们? 问题答案: 两种方式: 1.在你的类中实现,然后使用; 稍后,你必须定义一个方法。但是,对多个按钮执行此操作可能会造成混淆,因为该方法将必须检查每个事件()的来源以查看其来自哪个按钮。 2.使用匿名内部类: 稍后,你必须定义。当你有多个按钮时,这样做效果更好,

  • 我正在使用JFrame Gui,还没有找到使用事件处理程序actionlistener更改JLabel背景的方法。主要的问题是我创建了一个JPanel,里面有4个JLabel。我不确定为什么不能使用JPanel容器中的JLabel变量。我已经尝试为JLabel创建一个字段,但是当我尝试使用该字段时,它返回null。getBackground()方法。我还尝试使用for循环获取JPanel的组件,并

  • 我的JButton ActionListener有问题。我在另一个类中定义了一个doTheCleaning()方法,当调用该方法时,会对GUI进行一系列更改。 然后,在另一个类中,我实例化了包含doTheCleaning()方法的类,并用jbutton的actionperformed()方法编写了ActionListener,如下所示: 我知道如何执行其他操作,比如addActionListene