如何使Java JButton在触摸屏上呈现视觉上的按下效果?

11

我有一个简单的Swing GUI,其中包含在Surface平板电脑上使用的触摸屏幕的JButtons。这些按钮有 ActionListeners。当从鼠标单击这些按钮时,它们在视觉上正确地凹陷。但是当它们从触摸屏幕被轻敲时,它们在视觉上仍然保持不变,但仍会触发actionPerformed()。如果它们被双击,则它们在视觉上正确地凹陷,但会触发2个actionPerformed()

是否有一种方法可以在按下按钮时进行按钮动画更改,而不是点击?我已经测试过,并且可以使用MouseListener并将所有逻辑放在mouseClicked()中,但是要求触摸屏幕用户双击按钮并不是很优雅。


  1. 覆盖来自ButtonModel的事件以进行测试目的
  2. 没有明确问题细节的问题,这里有一些使用触摸屏的用户
  3. 使用了重要的L&F
  4. 投票关闭,因为过于宽泛
- mKorbel
5
这是一个非常清晰、具体和写得很好的问题。它在发布后的半个小时内获得了10个赞。这里对于好问题有太多膝反射式的关闭。 - chiastic-security
2个回答

5
您的问题在于,鼠标单击是一个复合事件,而屏幕触摸不是。因此,在第一个事件中它不能被按下,第二个事件中再抬起。
但是,当您收到触摸事件时,可以改变按钮的视觉状态,使其看起来被按下(使用setPressed(true)),然后设置一个大约100毫秒的计时器,并在计时器到期时将状态设置回正常(使用setPressed(false))。
注意计时器的过期时间:您需要在UI线程上执行setPressed(false)。因此,您需要使用SwingUtilities.invokeLater()作为第二个setPressed调用的包装器。或者,另一种方法是使用javax.swing.Timer作为排队第二个调用的手段;它接受延迟和一个Action,并且Action在UI线程上执行。

不,我没有任何问题,也没有关于JButtons绘制的问题。 - mKorbel
谢谢,我会尝试一下,看看这种方法能否成功。 - Stuart Lacy

-1

我使用鼠标监听器,但我在mousePressed方法中实现我的逻辑,在IBM触摸屏上完美运行。

class BtnNumbMl implements MouseListener {

    public void mousePressed(MouseEvent e) {
        **//your logic goes here**
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub
        
    }

}

祝你有美好的一天


你需要测试一下,你正在空谈。我们正在讨论的是 mouseClicked 方法在触摸屏上无法正常工作。另一方面,mousePressed 的表现符合预期。 - Boufouss Mohamed
我不明白你在说什么“你必须测试这个,你是在空中说话。” 没有人说mouseClicked不起作用。他们说点击JButton会导致动作触发,但按钮从未出现按下的状态。你的回答如何解决这个问题? - matt
你的回答毫无意义。你列出了一堆包含但未知的lbl1,lbl2?flag?btnValidate?我的观点是你应该解释一下你的答案为什么或者如何运作。 - matt
好的,谢谢您先生。对于这个问题我感到很抱歉。那只是我的逻辑,请不要考虑它。重点是 mouseClicked 在触摸屏上无法正常工作,而 mousePressed 可以按预期响应用户操作。 - Boufouss Mohamed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接