2015-11-14 95 views
1

我有一個看起來像this的主Java GUI。將JPanel設置爲另一個類的新JPanel

enter image description here

基本上有一個containerPanel其中包含的卡CardPanel都(右手側),然後一個GridLayout的的TabPanel在左手側。

cardPanel包含許多卡,其中之一是患者卡。這基本上顯示了一個包含患者JTable的JPanel。

我想調用的代碼,如:

cards = new CardLayout(); 
cardPanel = new JPanel(); 
containerPanel.add(cardPanel, BorderLayout.CENTER); 
cardPanel.setLayout(cards); 
cards.show(cardPanel, null); 

patientsCard = new CSVTable(); 
cardPanel.add(patientsCard, "View Patients Panel"); 

然後調用它通過查看:

viewButton = new JButton("View Patients"); 
     tabsPanel.add(viewButton); 
     viewButton.addActionListener(new ActionListener() { 
      @Override public void actionPerformed(ActionEvent event) { 
       cards.show(cardPanel,"View Patients Panel"); 
      } 
     }); 

不是說這個代碼實際工作對我的註冊面板沒有從其他類中調用,但就像:

registrationCard = new JPanel() 

由於某些原因,此CSVTable鍋當從主GUI內調用el時根本不會顯示,即使我做簡單的事情就像改變背景一樣。我嘗試了各種措施,包括努力包括CSVTableRunnabletry方法,改變patientCard型,將CSVTable對象,改變變量public,把CSVTable()代碼在public static void main(String[] args) method而不是一個構造函數。

但是,我知道CSVTable代碼的作品,因爲我試圖通過的WindowBuilder使用完全相同的代碼創建一個新的Swing應用程序窗口(但只是一個JFrame包括在內,而不僅僅是一個JPanel),它運行和外觀如this

enter image description here

有關的信息,這是我的CSVTable()類代碼:

package hospitalsystem; 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.io.FileReader; 
import java.io.Reader; 
import java.util.Arrays; 
import java.util.Scanner; 
import java.util.Vector; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextPane; 
import javax.swing.table.DefaultTableModel; 


public class CSVTable extends JPanel { 

    /* 
    * These are all static because I initially had these being referred to in a main class in CSVTable 
    */ 
    public static String datafile; 
    public static DefaultTableModel m; 
    public static JPanel viewCard; 
    public static FileReader fin; 
    public static JScrollPane patientScrollPane; 
    public static JTable patientTable; 
    public static Dimension patientPaneDimension; 


    public DefaultTableModel createTableModel(Reader in, Vector<Object> headers) { 
      DefaultTableModel model = null; 
      Scanner s = null; 
      Vector<Object> c; 
      try { 
       Vector<Vector<Object>> rows = new Vector<Vector<Object>>(); 
       s = new Scanner(in); 
       while (s.hasNextLine()) { 
        rows.add(new Vector<Object>(
          Arrays.asList(s.nextLine().split("\\s*,\\s*", -1)))); 
       } 
       if (headers == null) { 
        headers = rows.remove(0); 
        model = new DefaultTableModel(rows, headers); 
       } else { 
        model = new DefaultTableModel(rows, headers); 
       } 
       return model; 
      } finally { 
       s.close(); 
      } 
     } 


    public CSVTable(){ 
     try {  
      datafile = "[my file location, kept private]"; 
      fin = new FileReader(datafile); 
      m = createTableModel(fin, null);//This uses the method above 
      System.out.println(m); 
      viewCard = new JPanel(); 
      viewCard.setLayout(new BorderLayout()); 
      viewCard.setBackground(Color.BLACK);//This was not being called at all 
      patientTable = new JTable(m); 
      patientTable.setPreferredScrollableViewportSize(new Dimension(700, 70)); 
      patientTable.setFillsViewportHeight(true); 
      patientScrollPane = new JScrollPane(patientTable); 
      patientScrollPane.setBackground(Color.WHITE); 
      patientScrollPane.setOpaque(true); 
      patientTable.setBackground(Color.WHITE); 
      viewCard.add(patientScrollPane, BorderLayout.CENTER); 
      viewCard.add(patientTable, BorderLayout.CENTER); 
      viewCard.setVisible(true); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

} 
+0

想要更好的幫助,請考慮創建併發布[最小,完整和可驗證示例程序](http://stackoverflow.com/help/mcve)。我們不想看到你的整個程序,而是你應該將你的代碼壓縮到仍然編譯的最小位,沒有額外的代碼與你的問題無關,但仍然表明你的問題。通過簡單地嘗試隔離並暴露錯誤,您可能很好地解決了這個問題。 –

+0

CSVTable代碼無關的問題:您正在過度使用並嚴重濫用'static'修飾符,因爲該類的所有字段都不應該是靜態的。請相信我。這不太可能是您的錯誤的原因,但從長遠來看,這不會對您有所幫助。 –

+0

謝謝,欣賞指針;) –

回答

0

我曾這一點我自己。

我打電話

patientsCard = new CSVTable();

這應自動生成一個新的JPanel。然而,CSVTable類中,我也可以通過產生的新JPanel:

viewCard = new JPanel();

當我刪除所有引用viewCard,這個新JPanel,在CSVTable類,我的面板正確呈現在主界面。

希望這可以幫助其他人在相同的情況。

相關問題