中的getRootPane()默认的按钮 - 这是一个错误?(getRootPane() defau

2019-08-17 20:19发布

我做了一个SSCCE。 请注意,它必须是Windows外观和感觉。

import java.awt.*;
import javax.swing.*;

public class DefaultButtonBug {
private static final String LAF_WINDOWS = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";

public static void main(String[] args) {

    try {
        UIManager.setLookAndFeel(LAF_WINDOWS);
    } catch (Exception ex) {
        System.out.println("Setting the L&F failed so I cannot reproduce the bug.");
        System.exit(1);
    }

    EventQueue.invokeLater(new Runnable() {

        @Override
        public void run() {
            JPanel content = new JPanel();
            JButton defaultButton = new JButton("Default");

            content.add(defaultButton);

            JFrame frame = new JFrame();

            frame.getRootPane().setDefaultButton(defaultButton);
            frame.setContentPane(content);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setVisible(true);                
        }
    });
}
}
  • 启动这个
  • 该按钮应该被重点关注。 如果没有,请单击它。
  • 点击任何其他窗口,以确保这一当前窗口失去焦点
  • 按钮保存动画中蓝色的色调,即使该窗口没有焦点了!

按钮“脉动”动画是在标准的Java L&F不存在的东西。

备注:当这个按钮不再默认按钮(删除代码中的相应的行),该按钮将窗口失去焦点,并且没有任何的动画之后是灰色的。

我对你的问题是:这被认为是一个错误? 因为这使得美国东部时间继续做的东西,而不是在背后却隐藏着另一个窗口也窗口处于空闲状态(我做了一些分析)。 事实上,这是困扰我的最重要的东西:隐藏的窗口不会使EDT进入空闲状态。

Answer 1:

中的getRootPane()默认的按钮 - 这是一个错误?

  • 不如由@Guillaume波莱评论描述

  • 但我会倾向于使用键绑定,因为FocusInWindow任何JComponents并添加的ActionListener可以消耗()ENTER键按下时,所有Jbutton将JComponents

  • 焦点是由可管理getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT/*.WHEN_FOCUSED*/)

  • 通知(运OS)的JButton已实现TAB作为一个KeyBinding加速器了。

从代码

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class DefaultButtonBug {

    private static final String LAF_WINDOWS = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(LAF_WINDOWS);
        } catch (Exception ex) {
            System.out.println("Setting the L&F failed so I cannot reproduce the bug.");
            System.exit(1);
        }
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JPanel content = new JPanel();
                JButton focusedButton1 = new JButton("Focused");
                focusedButton1.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        System.out.println("Focused pressed");
                    }
                });
                content.add(focusedButton1);
                final JButton defaultButton2 = new JButton("Default");
                defaultButton2.setIcon(UIManager.getIcon("OptionPane.informationIcon"));
                defaultButton2.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        System.out.println("Default pressed");
                    }
                });
                defaultButton2.getModel().addChangeListener(new ChangeListener() {
                    @Override
                    public void stateChanged(ChangeEvent e) {
                        ButtonModel model = (ButtonModel) e.getSource();
                        if (model.isRollover()) {
                            defaultButton2.setIcon(UIManager.getIcon("OptionPane.errorIcon"));
                        } else {
                            defaultButton2.setIcon(UIManager.getIcon("OptionPane.informationIcon"));
                        }
                    }
                });
                content.add(defaultButton2);
                JFrame frame = new JFrame();
                frame.getRootPane().setDefaultButton(defaultButton2);
                frame.getRootPane().getInputMap(
                        JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT/*.WHEN_FOCUSED*/)
                        .put(KeyStroke.getKeyStroke("ENTER"), "clickButton");
                frame.getRootPane().getActionMap().put("clickButton", new AbstractAction() {
                    private static final long serialVersionUID = 1L;

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        defaultButton2.doClick();
                    }
                });
                frame.getRootPane().setDefaultButton(defaultButton2);
                frame.setContentPane(content);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}

一天的学习项目

  • Win7上/ 8上un_focused爪哇窗口(的Java6 / 7)被允许鼠标事件(对于所有标准L&F),可从听者的ChangeListener加到ButtonModel的

  • 在WinXP不起作用

重点

un_fosused射击同一事件

编辑

在Win7中JDK7_011闪烁Jbutton将汇编(集中于Java的窗口)与蓝色

  • 与第二期蓝色闪烁



文章来源: getRootPane() default button - Is this a bug?