2013-07-24 1 views
4

Я нашел in the Internet такой информации:Java Swing - JDialog фокус по умолчанию

«Когда JDialog (или JFrame по этому вопросу) становится видимым, акцент делается на первом фокусируемого компонента по умолчанию.»

Рассмотрим такой код:

public class MyDialog extends JDialog{ 
    // Dialog's components: 
    private JLabel dialogLabel1 = new JLabel("Hello"); 
    private JLabel dialogLabel2 = new JLabel("Message"); 
    private JButton dialogBtn = new JButton("Sample Btn text"); 

    public MyDialog(JFrame parent, String title, ModalityType modality){ 
     super(parent, title, modality); 
     dialogBtn.setName("Button"); // 
     dialogLabel1.setName("Label1"); // - setting names 
     dialogLabel2.setName("Label2"); // 
     setTitle(title); 
     setModalityType(modality); 
     setSize(300, 100); 
     setLocation(200, 200); 
     // adding comps to contentPane 
     getContentPane().add(dialogLabel1, BorderLayout.PAGE_START); 
     getContentPane().add(dialogBtn, BorderLayout.CENTER); 
     getContentPane().add(dialogLabel2, BorderLayout.PAGE_END); 
     pack(); 
    } 

    public void showDialog(){ 
     setVisible(true); 
     listComps(rootPane.getComponents()); 
     setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
    } 

    /* 
    * Itereates through all subcomps recursively and displays some relevant info 
    * OUTPUT FORM: ComponentName | isFocusable | hasFocus 
    */ 
    private void listComps(Component[] comps){ 
     if(comps.length == 0) return; 
     for(Component c : comps){  
      JComponent jC = (JComponent)c; 
      System.out.println(jC.getName() + " | " + jC.isFocusable() +" | " + jC.hasFocus()); 
      listComps(jC.getComponents()); 
     }  
    } 

    public static void main(String[] args) { 
     final JFrame frame = new JFrame(); 
     frame.setPreferredSize(new Dimension(300, 400)); 
     frame.setVisible(true); 
     JButton btn = new JButton("Show dialog"); 
     btn.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
        MyDialog dialog = new MyDialog(frame, "Sample title", ModalityType.APPLICATION_MODAL); 
        dialog.showDialog(); 
      } 
     }); 
     frame.add(btn, BorderLayout.CENTER); 
     frame.pack(); 
    } 
} 

Выход: пробег:

null.glassPane | true | false 
null.layeredPane | true | false 
null.contentPane | true | false 
Label1 | true | false 
Button | true | true 
Label2 | true | false 

Почему фокус установлен на JButton ?? Это не первый настраиваемый компонент! Когда я удалил JButton, фокус не был получен ни к одному компоненту. Зачем? Все вменяемые являются фокусируемыми по умолчанию ...

+3

Что бы это значило для фокусировки на ярлыке? Кажется, что кнопка является единственным компонентом, для которого фокусировка имеет смысл. –

+0

Хороший вопрос, создание нового контейнера верхнего уровня (основанного на pers из родной ОС) довольно сложное и продолжительное действие, 1. обязательный перенос в invokeLater == Учебник Oracle Совместимость в Swing - Initial Tread, 2. или pack и setVisible (true), 3. использовать теги кода – mKorbel

+1

Просто напишите 'dialogLabel1.requestFocusInWindow();' в конце конструктора 'MyDialog()', тогда 'JLabel' возьмет фокус вместо' JButton' ... –

ответ

5

Это не первый настраиваемый компонент! Когда я удалил JButton, фокус не был получен ни к одному компоненту. Зачем? По умолчанию все композиты настраиваются.

Чтобы ответить, почему: это решение FocusTraversalPolicy, в частности, принять (..) в DefaultFocusTraversalPolicy, который в конечном итоге возвращается к вспомогательному NullComponentPeer (который не является фокусируемым по умолчанию, как это на самом деле не существует :-)

ваш комментарий, он выглядит как реальный вопрос может быть «как реализовать сочетания клавиш, если rootPane не имеет фокусируемые детей» - если да, то варианты

  • использовать componentInputMap в rootPane, в WHEN_IN_FOCUSED_WINDOW
  • заставляют rootPane самофокусироваться (возможно, лучше всего это делать, только если у вас нет фокусованных детей)
+0

Я никогда не видел JDialog (украшен или не) с родителем (модальный/модальный или на), который потерял фокус, даже есть только JLabels, прошу или пропустите что-то – mKorbel

+0

@mKorbel ?? - извините, не понимаю, что вы имеете в виду – kleopatra

+0

, если у меня есть проблема с проблемой JDialogs, тогда он/она попробовал любой ZOO с его дочерними элементами (есть несколько вопросов с новым ядром unix или linux на Java7 (Open JDK)) или я промахиваюсь и не соглашаюсь ??? – mKorbel

2

Посмотрите на JLabel javadoc Он говорит:

область отображения на короткую текстовую строку или изображения, или оба. Метка не реагирует на входные события. В результате он не может получить фокус клавиатуры

Я думаю, что именно по этой причине ваш ярлык не фокусируется.

+0

Нечетность - это возвращаемое значение 'isFocusable()' – kiheru