【问题标题】:Java Swing feedback button on a tablet touch screen平板电脑触摸屏上的 Java Swing 反馈按钮
【发布时间】:2015-07-14 19:52:00
【问题描述】:

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

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

有什么想法吗?

非常感谢!

【问题讨论】:

  • “是否有可能从 JButton 获得反馈..” 你指的是什么“反馈”?
  • 您可能正在寻找自定义ButtonModel
  • 反馈指的是运动感觉,安德鲁。
  • ButtonModel 有什么区别,trashgod?

标签: java swing button tablet feedback


【解决方案1】:

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

【讨论】:

  • 谢谢!迁移到 JavaFX 是个好主意,但实际上是不可行的...... :-(
【解决方案2】:

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

首先,您必须使用像这样的 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();
            }
        });
    // ---

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

原因是在平板电脑屏幕上,组件的“onPressed”状态不适用于手指,就像鼠标指针一样。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 2014-09-09
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    相关资源
    最近更新 更多