2013-01-10 28 views
2

我有一個帶有多個JTabbedPane的swing GUI;每個選項卡頂部包含兩個JButtons,然後一個JTextArea(用於用戶輸入),底部包含JTextField以獲得結果。Java - 如何在選擇新的JTabbedPane時專注於JTextArea

我的問題是,我不能讓JTextArea切換標籤後沒有用鼠標點擊它或使用鍵盤上的標籤鍵獲得焦點?

我有...

frame.addWindowFocusListener(new WindowAdapter() { 
         public void windowGainedFocus(WindowEvent e) { 
          textArea_1.requestFocusInWindow(); 

...這工作得很好,當應用程序第一次運行(在第一個選項卡具有焦點textarea的),但是當我切換到另一個選項卡窗格的第一個按鈕,現在有焦點而不是textArea,當我切換回第一個選項卡時,textArea已失去焦點,並且第一個按鈕再次具有焦點。

我試着給每個textArea添加一個requestFocus,並且我已經嘗試過在每個textArea上「前置」,並且我已經與Focus Traversal混淆了,但是我沒有做任何事情似乎使textArea獲得焦點標籤更改?

這讓我難住了一個星期,所以任何幫助將感激地收到?

+0

嘗試使用SwingUtilities.invokeLater和調用textArea_1.requestFocusInWindow – MadProgrammer

+0

感謝MadProgrammer,我已經有invokeLater設置,並聲明這適用於程序第一次運行時,我有麻煩的是當我改變到另一個tabbedpane我可以不需要把重點放在組件(JtextArea)上? – user1938204

+0

不,我的意思是,在您的更改偵聽器中,使用SwingUtilities.invokeLater,並在調用requestFocusInWindow – MadProgrammer

回答

5

將ChangeListener添加到您的JTabbedPane。這裏的總體思路:對不起,我用來代替JTextAreas JTextField的情況下,因爲我有一個老樹樁周圍鋪設 - 但這個想法是一樣的]

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(); 
    } 
} 
+0

謝謝splungebob,我是新來的網站,我不知道我是否應該以回答下面的形式作出迴應,但這是我可以添加更多代碼的唯一方式......如果這是錯誤的,我表示歉意! – user1938204

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(); }}); 
       } 
      } 
     }); 

...現在一切都與世界再次合作!謝謝大家。

+0

然後你必須提供一個SSCCE(http://www.sscce.org)以獲得進一步的幫助。 – splungebob