【问题标题】:JButton long press eventJButton长按事件
【发布时间】:2014-05-26 14:33:56
【问题描述】:

我正在 NetBeans 平台上开发 Java 桌面应用程序。我有几个JFrames,在这些框架内我有几个JButtons。

我的应用程序将在工业 PC、基于 Linux 的面板 PC 等触摸面板上运行。所以我需要使用按钮的长按事件。

如何处理JButton的长按事件?点击事件是好的,但我找不到任何关于长按/长按的参考或示例。

【问题讨论】:

  • Swing 对长按事件没有标准支持。但是你可以实现它。当用户按下按钮时启动计时器,如果没有触发 mouseReleased/mouseDragged 事件,您可以触发您的操作
  • 如何处理JButton的长按事件? - 通过使用来自 ButtonModel 的事件(通过添加 ChangeListener)

标签: java swing event-handling jbutton


【解决方案1】:

这段代码对我有用。

abstract class MouseCustomAdapter extends MouseAdapter {
    private long mousePressedTime;
    private long delay = 1000;
    private Timer flashTimer;
    private Color originalForegroungColor;

    public MouseCustomAdapter() {}
    public MouseCustomAdapter(long delay) {
        this.delay = delay;
    }

    @Override
    public void mousePressed(MouseEvent e) {
        mousePressedTime = e.getWhen();
        if(flashTimer != null)
            flashTimer.cancel();
        flashTimer = new Timer("flash timer");
        flashTimer.schedule(new TimerTask() {
            @Override
            public void run() {
                originalForegroungColor = e.getComponent().getForeground();
                e.getComponent().setForeground(Color.LIGHT_GRAY);
            }
        }, delay);
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        flashTimer.cancel();
        e.getComponent().setForeground(originalForegroungColor);
        if(e.getWhen() - mousePressedTime > delay)
            longActionPerformed(e);
        else
            shortActionPerformed(e);
    }

    public abstract void shortActionPerformed(MouseEvent e);
    public abstract void longActionPerformed(MouseEvent e);
}

扩展实现 shortActionPerformed 和 longActionPerformed 的适配器。乙:

    menuButton.addMouseListener(new MouseCustomAdapter() {
        @Override
        public void shortActionPerformed(MouseEvent e) {
            System.out.prinln("Pressed short");
        }

        @Override
        public void longActionPerformed(MouseEvent e) {
            System.out.prinln("Pressed long");
        }
    });

【讨论】:

    【解决方案2】:

    如果你决定在你的实现中使用 JButton,你应该知道通常你不会对它们使用“点击事件”(尽管理论上你可以使用某种 MouseListener 组合来实现这一点)——所有AbstractButton 子类有一个 ActionListener 队列来处理激活按钮的默认平台事件。因此,您应该关注操作而不是“点击”

    http://docs.oracle.com/javase/tutorial/uiswing/components/button.html#abstractbutton

    http://docs.oracle.com/javase/7/docs/api/javax/swing/Action.html#buttonActions

    如果您确定要监视 JButton 对象上的长按事件,请向 ActionListener 添加一个计时器,例如通过 System.currentTimeMillis(),检查动作之间的时间差和/或使用 MouseListener(所有 java.awt.Component 子类都定义了 addMouseListener())和 mousePressed/mouseReleased 事件时间测量来获取时间增量,以便您可以检测'press'的长度。

    【讨论】:

    • 我实现了 mousePressed/mouseReleased 事件并通过摇摆计时器检测长按。
    猜你喜欢
    • 2011-09-04
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多