java - 如何让JButton在按住按钮时执行?

标签 java swing jbutton

首先,我的程序非常简单。我只需单击或按 Alt + Enter JButton 即可增加计数器。

这是该程序,您可以尝试一下:

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

public class holdDownClass implements ActionListener {
    private static JButton exebouton;
    private JTextArea ecran = new JTextArea();
    private JScrollPane scrollecran = new JScrollPane(ecran);
    private int counter = 0;

    public static void main(String[] args) {
        new holdDownClass();
    }

    private holdDownClass() {
        // Window
        JFrame frame = new JFrame("Name");
        frame.setBounds(400, 350, 625, 355);
        frame.setLayout(null);

        Container container = frame.getContentPane();

        // Panel
        JPanel panneau = new JPanel();
        panneau.setLayout(null);
        panneau.setBounds(2, 42, 146, 252);
        frame.add(panneau);

        JLabel nglabel = new JLabel("Click or Press Alt+Enter");
        nglabel.setBounds(5, 0, 200, 20);
        panneau.add(nglabel);

        // Button
        exebouton = new JButton("Execute");
        exebouton.setMnemonic(KeyEvent.VK_ENTER); // Shortcut: Alt + Enter
        exebouton.setBounds(4, 18, 138, 47);
        exebouton.addActionListener(this);
        panneau.add(exebouton);

        // Text Area
        ecran.setEditable(true);
        scrollecran.setBounds(150, 42, 467, 252);
        container.add(scrollecran);

        // Show
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        Object test = e.getSource();         
        if (test.equals(exebouton)) {
            counter += 1;
            ecran.setText(ecran.getText() + counter + "\n");
        }
    }
}

我的目标是:我想按住 Alt+Enter 来“更快”地增加计数器,而不是重复按 Alt+Enter。

最佳答案

您可以使用 MouseListener,但是,就我个人而言,我认为这不是实现您想要实现的目标的最合适方法,因为它与按钮的工作原理相冲突。

相反,您可以将更改监听器附加到按钮模型,并在按钮状态保持按下状态时循环使用 Swing Timer....

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class TestButton04 {

    public static void main(String[] args) {
        new TestButton04();
    }

    private int counter = 0;
    private Timer trigger;
    private JButton btn;

    public TestButton04() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                btn = new JButton("0");
                trigger = new Timer(125, new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        counter++;
                        btn.setText(String.valueOf(counter));
                    }
                });
                trigger.setCoalesce(true);
                trigger.setRepeats(true);

                btn.getModel().addChangeListener(new ChangeListener() {
                    @Override
                    public void stateChanged(ChangeEvent e) {
                        if (btn.getModel().isPressed()) {
                            trigger.start();
                        } else {
                            trigger.stop();
                        }
                    }
                });

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(btn);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }

        });
    }
}

关于java - 如何让JButton在按住按钮时执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15697713/

相关文章:

java - 在 JavaFx 中处理和扩展 Node 的正确方法

java - 使用 Redis Sentinel 正确配置 @EnableRedisHttpSession

java - JButton 在 Action 监听器和鼠标监听器完好无损的情况下不执行任何操作

java - 我需要更改 JButton 显示的图像

java - 如何在 JPA 中删除具有外主键的对象?

java - 有没有办法可以停止程序并等待用户单击按钮

java - 终止 JFrame 关闭上的运行线程

java - Java中的JButton悬停效果延迟

java - 将监听器添加到 JButton 数组;

java - 无法运行 ./gradlew connectedInstrumentTest