2016-01-26 2 views
0

У меня есть JTextField, который определяется следующим образом:JTextField не получить фокус, если не нажата

JTextField chatTextField = new JTextField(); 
chatTextField.setRequestFocusEnabled(false); 
chatTextField.addMouseListener(new MouseAdapter() { 
    @Override 
    public void mouseClicked(MouseEvent arg0) { 
     chatTextField.requestFocusInWindow(); 
    } 
}); 
chatTextField.setFocusTraversalKeysEnabled(false); 
chatTextField.setVisible(true); 

Есть некоторые другие вызовы метода я удалены в целях упрощения.

My chatTextField живет в JPanel, который добавлен в 'theDesktop'.

JFrame frame = new JFrame("Test"); 
JLayeredPane theDesktop = new JDesktopPane(); 
frame.getContentPane().add(theDesktop); 
frame.setFocusable(true); 

У меня есть много других JPanels, которые также добавлены «theDesktop», которые представляют другие окна (рюкзак, банк и т.д.). Я хочу, чтобы chatTextField получал фокус, когда я нажимаю на него мышь (или когда я нажимаю кнопку ввода, которую я также подключил через действие).

Иногда он фокусируется, закрывая другие окна и заставляя меня сумасшедшим. Вы не можете закрыть панель чата или панель кнопок. Может ли кто-нибудь увидеть что-то не так? У меня возникли проблемы с SSCCE, потому что мои вещи gui огромны, и это сетевая игра. Любая помощь будет принята с благодарностью.

+0

Ну, общий вопрос будет то, что Там есть вред? Если это единственный настраиваемый компонент, то вполне вероятно, что, когда окно получает фокус, он пытается установить фокус на большинство логических компонентов, которые он может. Вы можете подумать о том, чтобы взглянуть на «WindowFocusListener» и вручную изменить сфокусированный компонент на что-то еще. – MadProgrammer

+0

вред - это переход пользователя с помощью клавиш WASD, когда он набирает фокус ... вместо этого они начинают печатать. Я посмотрю. Благодаря!! – KisnardOnline

+0

Итак, можно предположить, что компонент, в котором используется WASD, должен быть сконфигурирован как первый настраиваемый компонент, но я просто думаю здесь – MadProgrammer

ответ

1

Вот как я решил это. Кинда хаки, но это работает, я полагаю.

Anytime фокус был переведен в текстовом поле чата (то есть, закрывая определенное окно), я переключил внимание на мою панель кнопок (всегда видимая):

SwingUtilities.invokeLater(new Runnable() { 
    @Override 
    public void run() { 
     MyClient.buttonBarFrame.requestFocusInWindow(); //so chat does not request focus 
    } 
}); 
Смежные вопросы