JTable: добавление одного в JPanel, и он не отображает себя

Сейчас утро понедельника, а это значит, что мне пора потерпеть неудачу в Java Swing! Но, если серьезно, я не могу понять, почему мой динамически созданный JTable отказывается показывать себя после добавления в JPanel на JFrame, и был бы очень признателен за любую помощь в выделении этой неприятной проблемы. Как вы можете видеть из кода, я вызвал дюжину различных методов, но не могу найти правильный, чтобы он отображался... возможно, я что-то пропустил?

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package energizingemerald;


import javax.swing.*;
import java.awt.Dimension;
/**
 *
 * @author Ryan
 */
public class SectionManagerFrame extends javax.swing.JFrame {

    /**
     * Creates new form SectionManagerFrame
     */
    public SectionManagerFrame() {
        initComponents();


    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jButton_Cancel = new javax.swing.JButton();
        jButton_OK = new javax.swing.JButton();
        jLabel_Title = new javax.swing.JLabel();
        jLabel_Description = new javax.swing.JLabel();
        jTextField_Title = new javax.swing.JTextField();
        jScrollPane2 = new javax.swing.JScrollPane();
        jTextArea_Description = new javax.swing.JTextArea();
        jButton_Remove = new javax.swing.JButton();
        jButton_Add = new javax.swing.JButton();
        jButton_Edit = new javax.swing.JButton();
        jPanel_Grid = new javax.swing.JPanel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowOpened(java.awt.event.WindowEvent evt) {
                formWindowOpened(evt);
            }
        });

        jButton_Cancel.setText("Cancel");
        jButton_Cancel.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jButton_CancelMouseClicked(evt);
            }
        });

        jButton_OK.setText("OK");
        jButton_OK.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jButton_OKMouseClicked(evt);
            }
        });

        jLabel_Title.setText("Review Title:");

        jLabel_Description.setText("Review Description:");

        jTextArea_Description.setColumns(20);
        jTextArea_Description.setRows(5);
        jScrollPane2.setViewportView(jTextArea_Description);

        jButton_Remove.setText("Remove");

        jButton_Add.setText("Add");

        jButton_Edit.setText("Edit");

        javax.swing.GroupLayout jPanel_GridLayout = new javax.swing.GroupLayout(jPanel_Grid);
        jPanel_Grid.setLayout(jPanel_GridLayout);
        jPanel_GridLayout.setHorizontalGroup(
            jPanel_GridLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );
        jPanel_GridLayout.setVerticalGroup(
            jPanel_GridLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 268, Short.MAX_VALUE)
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(122, 122, 122)
                        .addComponent(jButton_Cancel)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jButton_OK)
                        .addGap(0, 0, Short.MAX_VALUE))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jPanel_Grid, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addGap(18, 18, 18)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(jButton_Remove, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(jButton_Add, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(jButton_Edit, javax.swing.GroupLayout.PREFERRED_SIZE, 71, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel_Description)
                            .addComponent(jLabel_Title))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jTextField_Title))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 587, Short.MAX_VALUE)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel_Title)
                    .addComponent(jTextField_Title, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jLabel_Description)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 196, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jButton_Add)
                        .addGap(3, 3, 3)
                        .addComponent(jButton_Edit)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jButton_Remove))
                    .addComponent(jPanel_Grid, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButton_Cancel)
                    .addComponent(jButton_OK))
                .addContainerGap())
        );

        pack();
    }// </editor-fold>                        

    private void jButton_CancelMouseClicked(java.awt.event.MouseEvent evt) {                                            
        // TODO add your handling code here:
        this.setVisible(false);
        this.dispose();
    }                                           

    private void jButton_OKMouseClicked(java.awt.event.MouseEvent evt) {                                        
        // TODO add your handling code here:
    }                                       

    private void formWindowOpened(java.awt.event.WindowEvent evt) {                                  
        // TODO add your handling code here:
        //ManagerDataModel newManagerDataModel = new ManagerDataModel();
        /*
        newManagerDataModel.AddColumn("Section Name");
        newManagerDataModel.AddColumn("Section Type");
        newManagerDataModel.AddColumn("# of Particles");
        newManagerDataModel.AddRow(new String[]{"Test","Test","Test"});
        */
        jTable_Sections = new JTable(5, 5);
        //jTable_Sections.setPreferredScrollableViewportSize(new Dimension(500, 500));
        jTable_Sections.setMinimumSize(new Dimension(200, 200));
        jTable_Sections.setFillsViewportHeight(true);
        jScrollPane_Sections = new JScrollPane(jTable_Sections);
        jScrollPane_Sections.setMinimumSize(new Dimension(200, 200));
        jPanel_Grid.add(jTable_Sections);
        jPanel_Grid.add(jScrollPane_Sections);
        jPanel_Grid.validate();
        jPanel_Grid.repaint();
        this.validate();
        this.pack();
        this.repaint();


    }                                 
    private JTable jTable_Sections;
    private JScrollPane jScrollPane_Sections;
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(SectionManagerFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(SectionManagerFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(SectionManagerFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(SectionManagerFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new SectionManagerFrame().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton_Add;
    private javax.swing.JButton jButton_Cancel;
    private javax.swing.JButton jButton_Edit;
    private javax.swing.JButton jButton_OK;
    private javax.swing.JButton jButton_Remove;
    private javax.swing.JLabel jLabel_Description;
    private javax.swing.JLabel jLabel_Title;
    private javax.swing.JPanel jPanel_Grid;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JTextArea jTextArea_Description;
    private javax.swing.JTextField jTextField_Title;
    // End of variables declaration                   
}

person user978122    schedule 22.04.2013    source источник
comment
Попробуйте сначала добавить JTable к JScrollPane, а затем добавить его к JPanel.   -  person Praneeth Peiris    schedule 22.04.2013
comment
У вас есть проблема с JTable, но вы добавляете кучу кода, который совершенно не связан. Почему бы не сократить его до минимума?   -  person Robin    schedule 22.04.2013
comment
@Robin, когда я отлаживал, что я потерял PreferredSize для FlowLayout, может быть, я ошибаюсь EDIT :-) этот вопрос задавался здесь несколько раз, JScrollPane (независимо от того), добавленный в JPanel во время выполнения, игнорируется с помощью GroupLayout   -  person mKorbel    schedule 22.04.2013
comment
@GnomezGrave Я совершенно уверен, что сделал это. ;-)   -  person user978122    schedule 22.04.2013
comment
@mKorbel Итак, подождите, вы говорите, что это проблема с добавлением JScrollPane в JPanel во время выполнения?   -  person user978122    schedule 22.04.2013
comment
@user978122 user978122 Нет проблем с добавлением компонента во время выполнения. Но когда вы используете GroupLayout, вы также должны добавить компонент в обе группы макета (горизонтальную и вертикальную)!   -  person Howard    schedule 22.04.2013


Ответы (1)


не поклонник GroupLayout, но довольно просто исправить это

  • не используйте private void formWindowOpened(java.awt.event.WindowEvent evt) { для добавления JComponents в уже видимый контейнер, потому что это вызвано изменением размера и миганием с помощью графического интерфейса Swing

  • для GroupLayout должно быть переопределено Min, Max и PreferredSize в обоих направлениях, иначе игнорируется (по умолчанию см. сгенерированный код)

  • JPanel имеет FlowLayout, реализованный в API, а затем JTable, завернутый в JScolPane, теряется в GroupLayout (конечно, должно быть решение), вероятно, проблема с setMin, Max и PreferredSize

требуемый код (не решайте что-то с моим следующим пунктом)

private void formWindowOpened(java.awt.event.WindowEvent evt) {
    jTable_Sections = new JTable(5, 5);
    jTable_Sections.setFillsViewportHeight(true);
    jScrollPane_Sections = new JScrollPane(jTable_Sections);
    jPanel_Grid.setLayout(new BorderLayout());
    jPanel_Grid.add(jScrollPane_Sections);
    this.validate();
    this.repaint();
    this.pack();
}
  • этот код может быть около 50-70 строк кода в том случае, если весь код будет сделан вашими руками
person mKorbel    schedule 22.04.2013