【问题标题】:How to make a JButton appear "as rolled over"如何使 JButton 显示为“翻转”
【发布时间】:2017-02-09 16:22:27
【问题描述】:

滚动时 JButton 具有不同的外观。该外观与“选定”外观不同。

我想显示我的按钮“好像”它被翻转了,以便用户明白如果他按下 Return 键,该按钮将被触发。

这个问题与设置默认按钮不一样,因为我处于一种情况,我真的想让用户明白,虽然他不希望这样,但如果他点击输入,那个按钮就会被激活。下面为那些想要一些的人提供更多详细信息。将按钮设置为默认按钮会使按钮成为默认按钮,但不会向用户发出明显的信号。

在我的例子中,足够强的信号是按钮滚动时的外观。

怎么做?

有关情况的更多详细信息,对于那些想要一些的人:

  • 我有一个代表选项的按钮列表,顶部有一个文本框,用作按钮的过滤器
  • 当过滤器只剩下一个选项时,直接点击返回会点击该选项的按钮
  • 实际上,用户必须选择带有标签或箭头的按钮,然后按 Enter。
  • 由于该快捷方式不明显,我想向用户发出信号

【问题讨论】:

标签: java swing jbutton


【解决方案1】:

根据您的问题,您“真正”想要的是JRootPane#setDefaultButton,它将以特定于操作系统的方式突出显示按钮,并且如果用户按下默认的“操作”键(在大多数情况下为 Enter)将叫它ActionListener

例如...

“正常”按钮只是一个普通的旧JButtonHackedrollOver 设置为启用,Default 已设置为JRootPane 的默认按钮

如您所见,您建议 fix 在 MacOS 上不起作用,不知道它在其他平台上可能会做什么

我建议你看看How to Use Root Panes了解更多详情

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRootPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JButton asDefault = new JButton("Default");

        public TestPane() {
            JButton hack = new JButton("Hacked");
            hack.getModel().setRollover(true);
            hack.setRolloverEnabled(true);
            asDefault.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println("Defaulted");
                }
            });
            add(new JButton("Normal"));

            add(hack);
            add(asDefault);
        }

        @Override
        public void addNotify() {
            super.addNotify();
            JRootPane rootPane = SwingUtilities.getRootPane(this);
            if (rootPane != null) {
                rootPane.setDefaultButton(asDefault);
            }
        }

    }
}

因此,使用button.getModel().setRollover(true); 并非在所有平台上都有效,并且在它确实有效的平台上,我怀疑用户只需将鼠标移过它即可使其恢复正常

【讨论】:

  • 你建议 fix 在 MacOS 上没有任何作用 ...好吧,我碰巧在 MacOS 上开发,这解决了我的问题。这就是我在这里发布它的原因。
  • @VicSeedoubleyew 很抱歉,根据我的示例代码,它不起作用
  • @VicSeedoubleyew 你能给我一个可以运行的例子吗?因为我不能让它工作,而且我不是在谈论单行代码,而是我可以运行并看到工作的东西,因为我的示例代码没有,它包含你的单行
【解决方案2】:
button.getModel().setRollover(true);

【讨论】:

  • 请解释您的答案如何解决 OP 的问题。
  • 翻转与按钮按下不同,如果返回导致与按钮按下相同的动作,用户也不会期望看到。更好的解决方案是让按钮成为 JRootPane 的默认按钮,这样按下回车就会导致按钮被实际按下。
  • 您将翻转与“默认”混淆了,任何使用该操作系统的用户都会期望这些差异。也有可能通过用户将鼠标移入和移出控件来删除效果
  • @madprogrammer,我已经编辑了这个问题以消除误解。我不是在这里寻找默认值。如果还不清楚,请告诉我。
  • @wasiahmad,我真诚地努力理解这个答案如何不能解决问题,但没有成功。你能解释一下吗?我已经编辑了这个问题以提供更清晰的信息。希望这会有所帮助
猜你喜欢
  • 1970-01-01
  • 2013-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多