平板电脑触摸屏上的Java Swing反馈按钮

时间:2015-07-14 19:52:00

标签: java swing button tablet feedback

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

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

有什么想法吗?

非常感谢你!

2 个答案:

答案 0 :(得分:1)

我不完全确定您的意见是什么意思,但我想问你的问题是否定的问题的答案。 Swing从未被设计用于那种界面。但是,如果您所指的反馈类似按钮突出显示并在点击时膨胀,那么这通常是应该发生的事情。如果我怀疑你指的是在你触摸时执行的悬停动作但是没有“点击”按钮,那么你可能无法控制它。作为替代方案,如果您的应用程序尚未成熟,您可能需要考虑从swing切换到使用CSS的JavaFX,以便对此类内容进行大量控制。

答案 1 :(得分:0)

我有一个可以接受的解决方案。我将尝试尽可能简单和完整地解释它。

首先,你必须使用像这样的JButton扩展类:

    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();
            }
        });
    // ---

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

原因是因为在平板电脑屏幕上显示了&#39; onPressed&#39;组件的状态不像手指那样用鼠标指针工作。

关键:&#39; onClick&#39; =&#39; onPressed&#39; +&#39; onRelease&#39;。

&#39; onClick&#39;在触摸屏上正确完成。当你将手指从设备上松开时,就是这个技巧完成的那一刻。