Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java “如何使JButton出现”;如“翻滚”;_Java_Swing_Jbutton - Fatal编程技术网

Java “如何使JButton出现”;如“翻滚”;

Java “如何使JButton出现”;如“翻滚”;,java,swing,jbutton,Java,Swing,Jbutton,JButton在翻转时具有不同的外观。该外观与“选定”外观不同 我想显示我的按钮“好像”它被翻转了,这样用户就知道,如果他点击返回键,那个按钮就会被触发 问题与设置默认按钮不同,因为我真的想让用户明白,尽管他不希望这样,但如果他点击enter,该按钮将被激活。下面为那些想要的人提供更多详细信息。将button设置为默认会使button成为默认按钮,但不会向用户发出明显的信号 在我的例子中,足够强的信号是按钮翻转时的外观 怎么做 有关情况的更多详细信息,适用于想要了解情况的人: 我有一个代表选项

JButton在翻转时具有不同的外观。该外观与“选定”外观不同

我想显示我的按钮“好像”它被翻转了,这样用户就知道,如果他点击返回键,那个按钮就会被触发

问题与设置默认按钮不同,因为我真的想让用户明白,尽管他不希望这样,但如果他点击enter,该按钮将被激活。下面为那些想要的人提供更多详细信息。将button设置为默认会使button成为默认按钮,但不会向用户发出明显的信号

在我的例子中,足够强的信号是按钮翻转时的外观

怎么做

有关情况的更多详细信息,适用于想要了解情况的人:

  • 我有一个代表选项的按钮列表,顶部有一个文本框,它充当按钮的过滤器
  • 当过滤器只剩下一个选项时,点击return直接点击该选项的按钮
  • 实际上,用户必须选择带有tab或箭头的按钮,然后按enter键
  • 由于那个快捷方式不明显,我想用信号通知用户

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

例如

“正常”按钮只是一个普通的老式
JButton
Hacked
rollOver
设置为enabled,并且
Default
已设置为
JRootPane
的默认按钮

正如您所看到的,您建议fix在MacOS上什么都不做,不知道它在其他平台上会做什么

我建议你看一下,了解更多细节

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)
并不是在所有平台上都能工作,在那些平台上也能工作,我想用户只需移动鼠标即可恢复正常

请解释你的答案是如何解决OP的问题的。滚动与按下按钮不同,如果return导致的动作与按按钮相同,那么用户就不会期望看到这一点。更好的解决方案是将按钮设置为JRootPane的默认按钮,这样按return键会导致按钮被实际按下。您将滚动与“默认”混淆,任何用户在使用操作系统时都会期望存在差异。也有可能用户将鼠标移入或移出屏幕时会消除这种效果control@madprogrammer,我对问题进行了编辑,以消除误解。我不是在这里寻找默认值。如果还不清楚,请告诉我。@wasiahmad,我真诚地努力想弄明白这个答案是如何解决不了问题的,但没有成功。你能解释一下吗?我对问题进行了编辑,以提供更清晰的信息。希望这有帮助。可能是@catalinaisland的副本,我编辑了这个问题以消除误解。这些都是独立的问题,设置默认值并不能解决我的问题。你建议修复程序在MacOS上什么都不做。。。我碰巧在MacOS上开发,这解决了我的问题。这就是我把它贴在这里的原因。@Vicsedoubleyew很抱歉,根据我的示例代码,它没有work@VicSeedoubleyew你能给我一个可以运行的例子吗?因为我不能让它工作,我不是说一行代码,而是说一些我可以运行并看到工作的东西,因为我的示例代码没有,它包含您的一行代码
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);
            }
        }

    }
}