我正在NetBeans平台中开发Java桌面应用程序。我有几个JFrame
s,在这些框架中我有几个JButton
s。
我的应用程序将在工业PC,基于Linux的平板电脑等触摸面板上运行。因此我需要使用按钮的长按事件。
如何处理 JButton
的长按事件?点击事件没问题,但我找不到任何关于长按/长按的参考或样本。
答案 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");
}
});