JButton长按活动

时间:2014-05-26 14:33:56

标签: java swing event-handling jbutton

我正在NetBeans平台中开发Java桌面应用程序。我有几个JFrame s,在这些框架中我有几个JButton s。

我的应用程序将在工业PC,基于Linux的平板电脑等触摸面板上运行。因此我需要使用按钮的长按事件。

如何处理 JButton 的长按事件?点击事件没问题,但我找不到任何关于长按/长按的参考或样本。

2 个答案:

答案 0 :(得分:0)

如果你决定使用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事件时间测量来获得时间增量,以便你可以检测到'按下的长度。

答案 1 :(得分:0)

这段代码对我有用。

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");
        }
    });