|
|
|
Supreme Being
      
участник
Last Login: 30.03.2008 17:43
Сообщ.: 247,
Visits: 2 370
|
|
| Как мне задать элемент, изначально находящийся в фокусе? requestFocus работает только после отображения окна на экране, а мне хотелось бы задать енто дело в конструкторе окна... Использую менеджер компоновки BorderLayout и по умолчанию фокус ставится на элемент, находящийся в области BorderLayout.NORTH, а мне нужно начинасть с BorderLayout.CENTER... Есть там классы унаследованные от FocusTravelsalPolicy, но вот настроек у них никаких... разве что унаследовать с переопределением собственных методов, но это как-то слишком сложно для такой простой (и думается распространенной) операции
|
|
|
|
|
Forum Member
      
участник
Last Login: 31.01.2007 19:34
Сообщ.: 49,
Visits: 507
|
|
| java.awt.Component.requestFocusInWindow() должен помочь. И вообще Swing Tutorial читать не грех...
|
|
|
|
|
Supreme Being
      
участник
Last Login: 29.05.2008 20:04
Сообщ.: 269,
Visits: 2 381
|
|
несовсем уверен, что это то что тебе надо, но для передачи фокуса окну setFocusable(true);
----------------------------------
Я безработный...
Возьмите меня на работу. =)
|
|
|
|
|
Supreme Being
      
участник
Last Login: 30.03.2008 17:43
Сообщ.: 247,
Visits: 2 370
|
|
leska (08.01.2007) java.awt.Component.requestFocusInWindow() должен помочь. И вообще Swing Tutorial читать не грех...Не грех, но не такой уж и подвиг... Не помогло. Всякие requestFocus'ы начинают работать только после вывода окна на экран (что вполне логично). Мне же требовалось задать начальное положение фокуса при создании панели. За установку фокуса в компонентах отвечает класс-алгоритм LayoutFocusTraversalPolicy. Объект этого класса можно получить, но вот настроек у него соответствующих не нашел. Скорее всего помогла бы реализация своего класса на основе этого с переопределением какого-то метода. Но сроки поджимали невероятно (едва успел реализовать базовую функциональность). Посему решил задачу следующим образом - "да пусть начинает сверху - есть баги и посерьезней!" :) Vizlim (08.01.2007) несовсем уверен, что это то что тебе надо, но для передачи фокуса окну setFocusable(true); setFocusable нужно чтобы сказать, что компонент вообще (теоретически) может иметь фокус. Это свойство я конечно выставлял. Сам по себе этот метод фокуса вроде не передает.
|
|
|
|
|
Forum Member
      
участник
Last Login: 31.01.2007 19:34
Сообщ.: 49,
Visits: 507
|
|
Пока пришло в голову тока такое решение. Не очень красиво, но похоже на то что надо. Не понятно тока почему надо ставить фокус исключительно в конструкторе...
public class MyForm extends JFrame {
private JTextField textField1 = new JTextField("Default Focus");
private JTextField textField2 = new JTextField("My Focus");
private WindowAdapter wa;
public MyForm() {
getContentPane().setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
getContentPane().add(textField1);
getContentPane().add(textField2);
wa = new WindowAdapter() {
public void windowActivated(WindowEvent e) {
textField2.requestFocusInWindow();
e.getWindow().removeWindowListener(wa);
wa = null;
}
};
addWindowListener(wa);
}
public static void main(String[] args) {
MyForm f = new MyForm();
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
|
|
|
|
|
Forum Member
      
участник
Last Login: 13.11.2007 15:00
Сообщ.: 47,
Visits: 400
|
|
leska (15.01.2007) Не понятно тока почему надо ставить фокус исключительно в конструкторе...
Кто сказал?
Вы, конечно, можете избрать более правильный путь - реализовав нужную FocusTraversalPolicy. Но дерьма придется нахлебаться...
|
|
|
|
|
Supreme Being
      
участник
Last Login: 30.03.2008 17:43
Сообщ.: 247,
Visits: 2 370
|
|
wind (16.01.2007)
leska (15.01.2007) Не понятно тока почему надо ставить фокус исключительно в конструкторе...Кто сказал?
Вы, конечно, можете избрать более правильный путь - реализовав нужную FocusTraversalPolicy. Но дерьма придется нахлебаться... Это да, но вот хлебать-то и не хотелось. Фокус в конструкторе потому, что там кроме генерации интерфейса хотелось и правило обхода элементов сразу задать. И меня ведь полностью устраивал порядок обхода, обусловленный компоновщиками (там разные использовались), только вот начать нужно было с другого... Ставиль фокус по активации окна думал, но тоже слишком мудрено выходит (побоялся побочных эффектов - интерфейс довольно сложный и не исключалась возможность присутствия нескольких панелей с необходимостью задать начальный элемент).
|
|
|
|
|
Supreme Being
      
участник
Last Login: 16.03.2007 12:40
Сообщ.: 135,
Visits: 1 461
|
|
| WindowListener - это совсем уж криво. Используйте HierarchyListener. Он срабатывает, среди прочего, после того, как компонент показан или спрятан, там можно перебросить фокус куда нужно. Нужно только иметь в виду, что компонент показан - это не только когда окно открыли и показали, а еще в таких случаях как переключение табов на JTabbedPane или при использовании CardLayout.
А чтобы было по-человечески, нужно действительно сделать FocusTraversalPolicy. Вполне вразумительный механизм; в сравнении с тем, что было раньше, просто отличный. Никакого гемора я там не заметил.
|
|
|
|