我有一个包含多个JTabbedPane
s的swing GUI;每个标签页顶部包含两个JButtons
,然后是JTextArea
(用于用户输入),底部包含JTextField
的结果。
我的问题是,在没有用鼠标点击或使用键盘上的Tab键切换标签后,我无法让JTextArea
获得焦点?
我有......
frame.addWindowFocusListener(new WindowAdapter() {
public void windowGainedFocus(WindowEvent e) {
textArea_1.requestFocusInWindow();
...这在首次运行应用程序时效果很好(第一个选项卡中的textArea具有焦点)但是当我切换到另一个tabbedpane时,第一个按钮现在具有焦点而不是textArea,当我切换回来时在第一个标签中,textArea失去焦点,第一个按钮再次具有焦点。
我已经尝试为每个textArea添加一个requestFocus,并且我在每个textArea上尝试过“Bring to front”,并且我已经搞乱了Focus Traversal但是我没做什么似乎让textArea重点关注一个标签更改?
这让我难过了一个星期,所以会感激地收到任何帮助吗?
答案 0 :(得分:5)
将ChangeListener添加到JTabbedPane。这是一般的想法:
[抱歉,我使用了JTextFields而不是JTextAreas,因为我有一个旧的存根 - 但这个想法是一样的。]
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class JTabbedPaneDemo3 implements Runnable
{
JTextField txtFoo;
JTextField txtBar;
JTabbedPane tabbedPane;
public static void main(String[] args)
{
SwingUtilities.invokeLater(new JTabbedPaneDemo3());
}
public void run()
{
txtFoo = new JTextField(10);
final JPanel pnlFoo = new JPanel();
pnlFoo.add(new JButton("Button 1"));
pnlFoo.add(new JLabel("Foo"));
pnlFoo.add(txtFoo);
txtBar = new JTextField(10);
final JPanel pnlBar = new JPanel();
pnlBar.add(new JButton("Button 3"));
pnlBar.add(new JLabel("Bar"));
pnlBar.add(txtBar);
tabbedPane = new JTabbedPane();
tabbedPane.addTab("Tab 1", pnlFoo);
tabbedPane.addTab("Tab 2", pnlBar);
tabbedPane.addChangeListener(new ChangeListener()
{
public void stateChanged(ChangeEvent e)
{
Component comp = tabbedPane.getSelectedComponent();
if (comp.equals(pnlFoo))
{
txtFoo.requestFocusInWindow();
}
else if (comp.equals(pnlBar))
{
txtBar.requestFocusInWindow();
}
}
});
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(460, 200);
frame.getContentPane().add(tabbedPane, BorderLayout.CENTER);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
txtFoo.requestFocusInWindow();
}
}
答案 1 :(得分:0)
我无法让“getSelectedComponent()”为我工作,它只是没有看到对选项卡选择所做的任何更改,但我稍微修改了你的建议并接受了MadProgrammer的建议并添加了invokeLater ...
tabbedPane.addChangeListener(new ChangeListener()
{
public void stateChanged(ChangeEvent e)
{
JTabbedPane pane = (JTabbedPane) e.getSource();
int selectedIndex = pane.getSelectedIndex();
if (selectedIndex == 0)
{
SwingUtilities.invokeLater( new Runnable() {
public void run() {
textArea1.requestFocusInWindow(); }});
}
else if (selectedIndex == 1)
{
SwingUtilities.invokeLater( new Runnable() {
public void run() {
textArea2.requestFocusInWindow(); }});
}
else if (selectedIndex == 2)
{
SwingUtilities.invokeLater( new Runnable() {
public void run() {
textArea3.requestFocusInWindow(); }});
}
else if (selectedIndex == 3)
{
SwingUtilities.invokeLater( new Runnable() {
public void run() {
textArea4.requestFocusInWindow(); }});
}
else if (selectedIndex == 4)
{
SwingUtilities.invokeLater( new Runnable() {
public void run() {
textArea5.requestFocusInWindow(); }});
}
}
});
......现在再一次对世界都是对的!谢谢大家。