2015-11-14 37 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类,我的面板正确呈现在主界面。

希望这可以帮助其他人在相同的情况。