2013-07-08 96 views
1

添加JTabbedPane的新選項卡我在這裏有兩個類:MainScreen和QueryScreen。 MainScreen已經在int上實現了一個JTabbedPane。 QueryScreen擴展了MainScreen。我嘗試通過QueryScreen添加一個調用一個事件的選項卡,但它不會在應用程序中顯示。結帳請示例代碼:通過事件

QuerryScreen:

public class QueryScreen extends MainScreen { 

     private JSplitPane engineList; 
     final JPanel queryList = new JPanel(); 

     public QueryScreen(){ 

      tabbedPane.addTab("Query List", queryList); 
      add(tabbedPane, BorderLayout.CENTER); 

     } 
    } 

MainScreen:

public class MainScreen extends JFrame implements ActionListener { 
     /** 
     * 
     */ 
     JMenuBar bar; 
     JMenu file, register; 
     JMenuItem close, search; 
     ImageIcon image1= new ImageIcon("rsc/img/logo.jpg"); 
     JLabel lbImage1; 
     JTabbedPane tabbedPane = new JTabbedPane(); 
     final JPanel entrance = new JPanel(); 


     /** 
     * 
     */ 

public MainScreen() 
     {   
       lbImage1= new JLabel(image1, JLabel.CENTER); 
      entrance.add(lbImage1); 
      tabbedPane.addTab("Entrance", entrance); 
      add(tabbedPane, BorderLayout.CENTER); 

      bar= new JMenuBar(); 
      file= new JMenu("File"); 
      register= new JMenu("Search"); 

      close= new JMenuItem("Close"); 
      close.addActionListener(this); 

      search= new JMenuItem("Request Query"); 
      search.addActionListener(this); 


      //Keyboard Shortcut 
      register.setMnemonic(KeyEvent.VK_S); 
      file.setMnemonic(KeyEvent.VK_F); 
      search.setMnemonic(KeyEvent.VK_R); 




      //Ibimage1.setVerticalTextPosition(SwingConstants.CENTER); 

      bar.add(file); 
      bar.add(register); 
      file.add(close); 
      register.add(search); 
      setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH); // Maximized Window or setSize(getMaximumSize()); 
      setTitle("SHST"); 
      setJMenuBar(bar); 
      setDefaultCloseOperation(0); 

       WindowListener J=new WindowAdapter(){ 
       public void windowClosing(WindowEvent e){ 
       System.exit(0); 
       } 
      }; 

      addWindowListener(J); 
    } 

     public void actionPerformed(ActionEvent e){ 
      if(e.getSource()==close){ 
       System.exit(0); 
      } 

      if(e.getSource()==search){ 
       Search s= new Search(); 
       s.setVisible(true); 
      } 

      } 
    } 

PS:在MainScreen對象,從它的調用setVisible從只具有通話的運行類來臨這個MainScreen。

我該如何添加這個新選項卡?

在此先感謝

編輯一:

enter image description here

+1

這是一個完整的[示例](http://stackoverflow.com/a/15715096/230513)。 – trashgod

+1

爲了更好地提供幫助,請發佈[SSCCE](http://sscce.org/)。 –

回答

3

今後請張貼SSCCE,而不是複製/粘貼一些類。

這是你的MainScreen的SSCCE,與剝離出來的非必需品,並增加了一個主要方法:

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

public class MainScreen extends JFrame 
{ 
    JTabbedPane tabbedPane = new JTabbedPane(); 
    final JPanel entrance = new JPanel(); 

    public MainScreen() 
    { 
    tabbedPane.addTab("Entrance", entrance); 
    add(tabbedPane, BorderLayout.CENTER); 

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public static void main(String[] args) 
    { 
    SwingUtilities.invokeLater(new Runnable() 
    { 
     public void run() 
     { 
     JFrame frame = new MainScreen(); 
     frame.setSize(300, 200); 
     frame.setVisible(true); 
     } 
    }); 
    } 
} 

...這是爲QueryScreen的SSCCE:

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

public class QueryScreen extends MainScreen 
{ 
    final JPanel queryList = new JPanel(); 

    public QueryScreen() 
    { 
    tabbedPane.addTab("Query List", queryList); 
    //add(tabbedPane, BorderLayout.CENTER); /* not needed */ 
    } 

    public static void main(String[] args) 
    { 
    SwingUtilities.invokeLater(new Runnable() 
    { 
     public void run() 
     { 
     JFrame frame = new QueryScreen(); 
     frame.setSize(300, 200); 
     frame.setVisible(true); 
     } 
    }); 
    } 
} 

由於你可以看到,這是有效的,而且在大部分情況下,我所做的只是刪除不必要的代碼,併爲每個代碼添加一個主體。

如果您仍然遇到問題,請使用SSCCE更新您的問題,併發布您遇到的具體問題。

+0

感謝您的支持;它的工作幾乎和它應該一樣 - 但是在我用SSCCE發佈一個編輯之前,我想知道invokeLater的聲明究竟是什麼。關於http://docs.oracle.com/javase/6/docs/api/javax/swing/SwingUtilities.html它在這裏說,它異步運行另一個線程,也許這是我不想在我的問題代碼 - 檢查編輯一個屏幕;每次我打電話給queryScreen程序的一個窗口被調用;我想爲每個查詢調用另一個Tab。有什麼想法現在可以幫助嗎?謝謝 –