2012-02-04 69 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(); 
      } 
     }); 
    } 
} 
相關問題