Java Swing:看不到扩展 JPanel 的 class 组件

Java Swing: Can't see components of class that extends JPanel

我创建了这个扩展 JPanel 的 class JPanelCaso:

public class JPanelCaso extends JPanel implements MouseListener{
    JCheckBox checkBox;
    JTextArea textArea;
    String frasePerCliente = "";
    private int distanzaDaBordi = 0;
    private int distanzaCheckTextA = 5;
    private SpringLayout layoutPnlCaso = new SpringLayout();

    /**
     * Costruttore della classe Caso
     * 
     * @param checkBox l' oggetto di tipo JCheckBox relativo al caso
     * @param textArea l' oggetto di tipo JtextArea relativo al caso
     */
    JPanelCaso(String strTitoloCaso, String frasePerCliente){
        this.addMouseListener(this);

        checkBox = new JCheckBox();
        checkBox.addMouseListener(this);

        textArea = new JTextArea(strTitoloCaso);
        textArea.setLineWrap(true);
        textArea.setWrapStyleWord(true);
        textArea.addMouseListener(this);
        textArea.setEditable(false);

        this.frasePerCliente = frasePerCliente;

        componiPannello();

    }

    private void componiPannello() {
        this.setLayout(layoutPnlCaso);

        //Dispongo i controlli
        layoutPnlCaso.putConstraint(SpringLayout.WEST, checkBox, distanzaDaBordi, SpringLayout.WEST, this);
        layoutPnlCaso.putConstraint(SpringLayout.EAST, checkBox, -distanzaCheckTextA, SpringLayout.WEST, textArea);
        layoutPnlCaso.putConstraint(SpringLayout.WEST, textArea, -distanzaDaBordi, SpringLayout.WEST, this);
        layoutPnlCaso.putConstraint(SpringLayout.NORTH, checkBox, distanzaDaBordi, SpringLayout.NORTH, this);
        layoutPnlCaso.putConstraint(SpringLayout.NORTH, textArea, distanzaDaBordi, SpringLayout.NORTH, this);
        layoutPnlCaso.putConstraint(SpringLayout.SOUTH, textArea, distanzaDaBordi, SpringLayout.SOUTH, this);

        this.add(checkBox);
        this.add(textArea);

    }
}

然后我在一个 JPanel 中插入各种 JPanelCaso,这是另一个 JPanel 的卡片布局:

public class GuidaBpoEse{

    public static void main(String[] args) {

        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new GuidaBpoEse();
            }
        }); 
    }

    public GuidaBpoEse() {      
        creaFinestraMain();
    }


    Workbook wbDbCommentiEse = null;
    Dimension grandezzaSchermo = Toolkit.getDefaultToolkit().getScreenSize();
    int larghezzaMain = (int)(grandezzaSchermo.getWidth() * 0.20);
    int altezzaMain = (int)(grandezzaSchermo.getHeight() * 0.95);
    Point inizioMain = new Point((int)grandezzaSchermo.getWidth() - larghezzaMain, 0);
    JFrame frmMain = new JFrame();

    int nFogli;
    int iFoglio = 0;
    int righe;  //conta le righe del iFoglio fino all' ultima piena
    int colonne;    //conta le colonne del iFoglio fino all' ultima piena
    int riga;
    int colonna;

    int distanzaTraCasi = 5;
    int distanzaDaBordi = 0;

    static JTextArea txtaFrasiTrovate;

    private void creaFinestraMain() {
        try {
            wbDbCommentiEse = Workbook.getWorkbook(new File("db.xls"));
        } catch (BiffException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        nFogli = wbDbCommentiEse.getNumberOfSheets();

        ...

        SpringLayout layoutMain = new SpringLayout();
        JPanel pnlMain = new JPanel(layoutMain);

        ...

            // Pannello della scelta delle macrocasistiche ==================================================

            JPanel pnlMacrocasistiche = new JPanel(new GridLayout(nFogli - 2, 1));
            JScrollPane spnlMacrocasistiche = null;
            JButton[] btnMacrocasistiche = new JButton[nFogli]; //Salterò il primo elemento per far corrispondere l' indice dei fogli nel file excel con l' indice dei fogli nell' array di tasti
            Sheet sAppoggio;
            iFoglio++;
            while (iFoglio < nFogli - 1) {
                iFoglio++;
                sAppoggio = wbDbCommentiEse.getSheet(iFoglio);
                btnMacrocasistiche[iFoglio] = new JButton(sAppoggio.getName());
                pnlMacrocasistiche.add(btnMacrocasistiche[iFoglio]);
                btnMacrocasistiche[iFoglio].addMouseListener(new MouseListener() {

                    @Override
                    public void mouseEntered(MouseEvent arg0) {
                        JButton btnAppoggio = (JButton)arg0.getSource();
                        layoutPnlDettagli.show(pnlDettagli, btnAppoggio.getText());
                        frmDettagli.setVisible(true);
                    }

                    ...

                });
            }
            spnlMacrocasistiche = new JScrollPane(pnlMacrocasistiche);
            spnlMacrocasistiche.setBorder(BorderFactory.createTitledBorder("Macrocasistiche"));
            pnlMain.add(spnlMacrocasistiche);
            // ==============================================================================================



            //Posiziono spnlMacrocasistiche
            spnlMacrocasistiche.setPreferredSize(new Dimension((int)frmMain.getWidth(), (int)(frmMain.getHeight() * 0.4)));;
            layoutMain.putConstraint(SpringLayout.NORTH, spnlMacrocasistiche, distanzaDaBordi, SpringLayout.SOUTH, pnlDatiCliente);
            layoutMain.putConstraint(SpringLayout.WEST, spnlMacrocasistiche, distanzaDaBordi, SpringLayout.WEST, pnlMain);
            layoutMain.putConstraint(SpringLayout.EAST, spnlMacrocasistiche, -distanzaDaBordi, SpringLayout.EAST, pnlMain);

        frmMain.add(pnlMain);
        creaFinestraDettagliCasistiche();

        frmMain.validate();
        //frmMain.pack();
        frmMain.setVisible(true);
        frmMain.setAlwaysOnTop(true);


    }


    JFrame frmDettagli;
    JPanel pnlDettagli;
    JScrollPane spnlDettagli;
    CardLayout layoutPnlDettagli = new CardLayout();
    SpringLayout layoutPnlCasistiche = new SpringLayout();

    private void creaFinestraDettagliCasistiche() {
        int larghezzaFrmDettagli = (int)(grandezzaSchermo.getWidth() * 0.15);
        int altezzaFrmDettagli = altezzaMain;
        frmDettagli = new JFrame();
        frmDettagli.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frmDettagli.setTitle("Controllo documenti ESE");
        frmDettagli.setSize(larghezzaFrmDettagli, altezzaFrmDettagli);
        Point inizioFrmDettagli = new Point((int)(inizioMain.getX() - frmDettagli.getWidth()), (int)(inizioMain.getY()));
        frmDettagli.setLocation(inizioFrmDettagli);


            pnlDettagli = new JPanel(layoutPnlDettagli);
            Dimension dimMinPnlDettagli = new Dimension((int)(frmDettagli.getWidth()), (int)frmDettagli.getHeight());
            pnlDettagli.setPreferredSize(dimMinPnlDettagli);

            iFoglio = 1;
            Sheet sAppoggio;
            JPanel[] pnlCasistiche = new JPanel[nFogli];
            JPanelCaso[] pnlCaso;

            while (iFoglio < nFogli - 1) {
                iFoglio++;
                sAppoggio = wbDbCommentiEse.getSheet(iFoglio);
                righe = sAppoggio.getRows();
                colonne = sAppoggio.getColumns();
                riga = 0;
                colonna = 0;

                pnlCasistiche[iFoglio] = new JPanel(layoutPnlCasistiche);
                pnlCasistiche[iFoglio].setBorder(BorderFactory.createTitledBorder(sAppoggio.getName()));
                    pnlCaso = new JPanelCaso[righe];
                    while (riga < righe) {
                        pnlCaso[riga] = new JPanelCaso(sAppoggio.getCell(colonna, riga).getContents(), sAppoggio.getCell(colonna + 1, riga).getContents());


                        //pnlCasistiche[iFoglio].add(new JLabel("Prova"));

                        pnlCasistiche[iFoglio].setSize(frmDettagli.getSize());
                        if (riga == 0) {
                            layoutPnlCasistiche.putConstraint(SpringLayout.NORTH, pnlCaso[riga], distanzaDaBordi, SpringLayout.NORTH, pnlCasistiche[iFoglio]);
                            layoutPnlCasistiche.putConstraint(SpringLayout.WEST, pnlCaso[riga], distanzaDaBordi, SpringLayout.WEST, pnlCasistiche[iFoglio]);
                            layoutPnlCasistiche.putConstraint(SpringLayout.EAST, pnlCaso[riga], distanzaDaBordi, SpringLayout.EAST, pnlCasistiche[iFoglio]);
                        } else {
                            layoutPnlCasistiche.putConstraint(SpringLayout.NORTH, pnlCaso[riga], distanzaTraCasi, SpringLayout.SOUTH, pnlCaso[riga - 1]);
                            layoutPnlCasistiche.putConstraint(SpringLayout.WEST, pnlCaso[riga], distanzaDaBordi, SpringLayout.WEST, pnlCasistiche[iFoglio]);
                            layoutPnlCasistiche.putConstraint(SpringLayout.EAST, pnlCaso[riga], distanzaDaBordi, SpringLayout.EAST, pnlCasistiche[iFoglio]);
                        }
                        pnlCasistiche[iFoglio].add(pnlCaso[riga]);
                        riga++;
                    }

                    pnlDettagli.add(pnlCasistiche[iFoglio], sAppoggio.getName());


            }

            pnlDettagli.addMouseListener(new MouseListener() {

                ...

                @Override
                public void mouseExited(MouseEvent e) {
                    frmDettagli.dispose();

                }

                ...

            });

            frmDettagli.add(pnlDettagli);
            frmDettagli.validate();
    }

}

显示了pnlDettagli的卡片,我可以看到边框但看不到内容,各种pnlCaso[riga];

我不明白为什么。我在添加组件之前设置了 Spring 布局并且 xls 文件充满了数据

非常感谢谁的回答,抱歉我的英语不好

    frmMain.add(pnlMain);
    //frmMain.pack();
    frmMain.setVisible(true);
    frmMain.setAlwaysOnTop(true);

    creaFinestraDettagliCasistiche();

在使框架可见之前,应将所有组件添加到框架中。所以代码应该是:

    frmMain.add(pnlMain);
    creaFinestraDettagliCasistiche();
    frmMain.pack();
    frmMain.setVisible(true);
    frmMain.setAlwaysOnTop(true);

如果那不能解决问题,那么我会说问题出在您的 SpringLayout 代码上。该布局通常仅由 IDE 使用,因为正确指定约束可能很困难。我建议您尝试另一个布局管理器(或布局管理器的组合)。

我已经解决了....我只需要为我的 JPanelCaso 设置首选大小......

感谢大家,主要是camickr的支持