2013-03-21 99 views
0

我做了一个SSCCE。请注意,它必须是Windows Look &感觉。getRootPane()默认按钮 - 这是一个错误?

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大号& F.

备注东西,当该按钮不再默认按钮(删除代码中的相应的行),则窗口失去焦点并且没有任何动画时,按钮将变为灰色。

我给你的问题是:这被认为是一个错误?因为当窗口被隐藏在另一个窗口后面时,这使得EDT保持干劲,而不是闲置(我做了一些分析)。事实上,最令我困扰的是:隐藏窗户并不会让美国东部时间闲置。

+0

没问题,在WinXp上测试过, 7,8用Java编译6/7 – mKorbel 2013-03-21 13:20:19

+0

@mKorbel在WinXP下你的外观和感觉在聚焦按钮上有那种发光/脉动动画吗? – Timmos 2013-03-21 13:21:53

+0

和JButton可以在focusLost上使用Win8/Java 7中的鼠标悬停功能(另一个窗口的焦点在操作系统中) – mKorbel 2013-03-21 13:22:19

回答

2

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

  • 不是由@Guillaume波莱

  • 但我倾向于使用键绑定在注释中所描述的,因为与任何FocusInWindow和JComponents加入的ActionListener可以消耗()ENTER键按下,所有Jbutton将JComponents

  • 重点是可管理的getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT/*.WHEN_FOCUSED*/)

  • notice(Win OS)JButton在KeyBindings中也实现了TAB作为加速器。

从代码

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(的Java6/7)被允许在un_focused爪哇窗口(鼠标事件的所有标准的L & F),可以从ChangeListener监听器添加到ButtonModel

  • 不是我窝RK在WinXP

集中

enter image description here

enter image description here

un_fosused发射相同的事件

enter image description here

编辑

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

  • 与蓝色的第二期闪烁

enter image description here

enter image description here