2012-02-04 67 views
1

我按计划要做的是当按Enter键时,应用程序将启动按钮btn_teach,并切换到另一个标签,集中注意力为textfield。现在,当我实现它时,它完美地工作如果我手动按下按钮(不按Enter)。当我实际按Enter时,选项卡会切换回来,但该选项卡上的文本字段未被聚焦。当在JTabbedPane中的标签之间切换时,通过KeyListener更改焦点

tpJTabbedPane。 我的计划是从标签索引1切换到标签索引0,并设置txt_send集中

public void actionPerformed(ActionEvent arg0) 
{ 
    // TODO Auto-generated method stub 
     String say = txt_saypane.getText(); 
     String ans = txt_anspane.getText(); 
     //this.clear(); 

     say = say.replace("\n",""); 
     ans = ans.replace("\n",""); 

     this.talk(this.botTeach(say,ans), false); 

     tp.setSelectedIndex(0); 
} 

    public void stateChanged(ChangeEvent arg0) 
{ 
    // TODO Auto-generated method stub 
    int sel = tp.getSelectedIndex(); 
    if(sel == 0) 
     txt_send.requestFocusInWindow(); 
    if(sel == 1) 
     txt_saypane.requestFocusInWindow(); 
} 

public void keyPressed(KeyEvent e) 
     { 
      // TODO Auto-generated method stub 
      if(e.getKeyCode() == KeyEvent.VK_ENTER) 
      { 

       if(txt_saypane.isFocusOwner() || txt_anspane.isFocusOwner()) 
        btn_teach.doClick(); 
      } 
    } 

什么是JTabbedPane标签之间切换时改变通过KeyListener焦点的正确方法是什么?

+0

好像这里按ENTER键单独才是真正的渔获物。为了达到这个目的,我尝试了所有可能的方法,但似乎必须使用另一个键与ENTER键一起才能获得所需的结果。不知道这是否是一个错误,因为过去从未遇到过这个问题。请尝试focusButton.addMnemonic(KeyEvent.VK_ENTER);正如我最近的编辑中所描述的那样,可以给出所需的结果。但是,当单独使用ENTER键时,似乎还有其他工作正在进行。 – 2012-02-04 15:23:36

回答

5

对于JButtonENTER键按下工作,你可以使JButton成为你DEFAULT Button的框架,而不是使用KeyEvents。您可以通过书面形式做到这一点:

yourFrameObject.getRootPane().setDefaultButton(btn_teach); 

写这条线也将使这个JButton的工作就按ENTER键,没有你写它整个的KeyListener部分。从JButton删除KeyListeners。一旦这JButtonDEFAULT Button,现在在按ENTER键,它将执行写入其actionPerformed()方法内的工作。

不要对Swing使用属于awt的KeyEvent,KeyBinding就是我们在Swing中使用的。

下面是一个示例程序来帮助您的事业:

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class ButtonTest extends JFrame implements ActionListener 
{ 
    private JTabbedPane tabbedPane; 
    private JButton focusButton; 
    private JPanel contentPane, tab1, tab2; 
    private JTextField textField1, textField2, textField3; 

    public ButtonTest() 
    { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationRelativeTo(null); 

     tab1 = new JPanel(); 
     textField1 = new JTextField(10); 
     textField1.requestFocusInWindow(); 
     tab1.add(textField1); 

     tab2 = new JPanel(); 
     textField2 = new JTextField(10); 
     textField3 = new JTextField(10); 
     tab2.add(textField2); 
     tab2.add(textField3); 

     contentPane = new JPanel(); 
     contentPane.setLayout(new BorderLayout()); 

     tabbedPane = new JTabbedPane(JTabbedPane.TOP, 
               JTabbedPane.WRAP_TAB_LAYOUT); 
     tabbedPane.addTab("TAB 1", null, tab1, "I am TAB 1"); 
     tabbedPane.addTab("TAB 2", null, tab2, "I am TAB 2"); 

     focusButton = new JButton("CHANGE FOCUS"); 
     //focusButton.addMnemonic(KeyEvent.VK_ENTER); /* You can Add this Line too 
                 /* , to make it work. But here 
                 * you have to press ALT + ENTER. 
                 */ 
     getRootPane().setDefaultButton(focusButton); 
     focusButton.addActionListener(this); 

     contentPane.add(tabbedPane, BorderLayout.CENTER); 
     contentPane.add(focusButton, BorderLayout.PAGE_END); 
     setContentPane(contentPane); 
     pack(); 
     setVisible(true); 
    } 

    public void actionPerformed(ActionEvent ae) 
    { 
     if (tabbedPane.getSelectedIndex() == 0) 
     { 
      tabbedPane.setSelectedIndex(1); 
      textField3.requestFocusInWindow(); 
     } 
     else if (tabbedPane.getSelectedIndex() == 1) 
     { 
      tabbedPane.setSelectedIndex(0); 
      textField1.requestFocusInWindow(); 
     } 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new ButtonTest(); 
      } 
     }); 
    } 
}