Java 平板触摸屏上的摆动反馈按钮

Java Swing feedback button on a tablet touch screen

是否可以在 Java 平板电脑上的 Swing 应用程序中从 JButton 获得反馈?

我正在使用 Windows 8,如果我将物理鼠标切换到设备,来自 JButton 的运动反馈是典型的方式,但如果我使用手指,反馈就会消失。 我已经尝试过重写自定义我继承的 JButtons 的方法,以及一个扩展等,但我没有希望达到目标......我想这与我们用鼠标触摸屏幕时有关,你只需点击屏幕上的一个点, 但如果用手指触摸, 则有几个像素被选中。

有什么想法吗?

非常感谢!

我不完全确定您所说的反馈是什么意思,但我认为您提出的问题的答案是否定的。 Swing 从来就不是为那种界面设计的。但是,如果您所指的反馈类似于按钮在单击时突出显示和膨胀,则这通常应该自行发生。如果我怀疑你指的是当你触摸但不 'tap' 按钮时执行的悬停动作,那么你可能无法控制它。作为替代方案,如果您的应用程序还不成熟,您可能需要考虑从 swing 切换到使用 CSS 的 JavaFX 来让您对此类事情进行大量控制。

我有一个可以接受的解决方案。我会尽量简单完整的解释一下。

首先,您必须像这样使用扩展的 JButton class:

    import java.awt.Color;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;

    import javax.swing.JButton;

    /**
     * Customized <code>JButton</code> to obtained a feedback user experience of movement.
     * @author Gabriel Moreno.
     */
    public class FeedbackTouchScreenButton extends JButton {

        public FeedbackTouchScreenButton() {
            super();

            this.addMouseListener(new MouseListener() {
                @Override
                public void mouseClicked(final MouseEvent e) {
                        new Thread(new Runnable() {
                            @Override
                            public void run() {
                                Color bg = e.getComponent().getBackground();
                                e.getComponent().setBackground(Color.BLUE); // For example
                                try {
                                    Thread.sleep(100);
                                } catch (InterruptedException e1) {
                                    e1.printStackTrace();
                                }
                                e.getComponent().setBackground(bg);
                            }
                        }).start();
                } // mouseClicked()

                @Override
                public void mouseEntered(MouseEvent e) {}
                @Override
                public void mouseExited(MouseEvent e) {}
                @Override
                public void mousePressed(MouseEvent e) {}
                @Override
                public void mouseReleased(MouseEvent e) {}
            });
        } // FeedbackTouchScreenButton()

    } // FeedbackTouchScreenButton

当您自定义相关按钮执行的操作时,您将不得不(小心地)抛出另一个线程。例如:

    // ---
        btnExample.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(final java.awt.event.ActionEvent evt) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        btnExampleActionPerformed(evt);
                    } // run()
                }).start();
            }
        });
    // ---

这个例子显然有效。但实际上只是看起来... :-)

原因是因为在平板电脑屏幕上,组件的 'onPressed' 状态无法像使用鼠标指针那样使用手指。

关键:'onClick' = 'onPressed' + 'onRelease'.

而'onClick'是在触摸屏上正确完成的。这是技巧完成的时刻,当您从设备上松开手指时。