2013-03-21 23 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