2012-05-15 3 views
2

У меня есть вопрос о вложенных BoxLayouts.Отображается JPanel для другого JPanel

Я хочу построить DropDownPanel, который состоит из 2 подпанелей: заголовок сверху и тело внизу. Тело изначально скрыто. Нажав на заголовок, вы можете переключить видимость тела и показать его содержимое (например, развернуть/свернуть).

В целом это нормально работает. Однако есть какое-то странное поведение:
Если только одна DropDownPanel расширена, а другая свернута, то свернутая DropDownPanel будет изменяться и перемещаться вправо.

Я уже экспериментировал со свойствами JPanel, такими как alignmentX, но я не мог найти свою ошибку. Кто-нибудь знает, что я делаю неправильно?

Вот код:
DropDownPanel.java

public class DropDownPanel extends javax.swing.JPanel { 

    private boolean mShowContent = false; 

    /** 
    * Creates new form DropDownPanel 
    */ 
    public DropDownPanel() { 
     initComponents(); 
     showContent(mShowContent); 
    } 

    private void showContent(boolean showContent) { 
     mShowContent = showContent; 
     System.out.println(mShowContent? "show" : "hide"); 
     body.setVisible(mShowContent); 
     revalidate(); 
    } 

    /** 
    * 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">//GEN-BEGIN:initComponents 
    private void initComponents() { 

     jPanel3 = new javax.swing.JPanel(); 
     header = new javax.swing.JPanel(); 
     jLabel1 = new javax.swing.JLabel(); 
     body = new javax.swing.JPanel(); 
     jPanel5 = new javax.swing.JPanel(); 
     jLabel2 = new javax.swing.JLabel(); 

     setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0))); 
     setLayout(new javax.swing.BoxLayout(this, javax.swing.BoxLayout.Y_AXIS)); 

     jPanel3.setLayout(new javax.swing.BoxLayout(jPanel3, javax.swing.BoxLayout.Y_AXIS)); 

     header.setMaximumSize(new java.awt.Dimension(32000, 60)); 
     header.setMinimumSize(new java.awt.Dimension(0, 60)); 
     header.setPreferredSize(new java.awt.Dimension(0, 60)); 
     header.addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mouseClicked(java.awt.event.MouseEvent evt) { 
       headerMouseClicked(evt); 
      } 
     }); 
     header.setLayout(new javax.swing.BoxLayout(header, javax.swing.BoxLayout.X_AXIS)); 

     jLabel1.setText("Click Me!"); 
     header.add(jLabel1); 

     jPanel3.add(header); 

     body.setLayout(new javax.swing.BoxLayout(body, javax.swing.BoxLayout.Y_AXIS)); 

     jPanel5.setLayout(new javax.swing.BoxLayout(jPanel5, javax.swing.BoxLayout.X_AXIS)); 

     jLabel2.setText("jLabel2"); 
     jPanel5.add(jLabel2); 

     body.add(jPanel5); 

     jPanel3.add(body); 

     add(jPanel3); 
    }// </editor-fold>//GEN-END:initComponents 

    private void headerMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_headerMouseClicked 
     System.out.println("asd"); 
     showContent(!mShowContent); 
    }//GEN-LAST:event_headerMouseClicked 
    // Variables declaration - do not modify//GEN-BEGIN:variables 
    private javax.swing.JPanel body; 
    private javax.swing.JPanel header; 
    private javax.swing.JLabel jLabel1; 
    private javax.swing.JLabel jLabel2; 
    private javax.swing.JPanel jPanel3; 
    private javax.swing.JPanel jPanel5; 
    // End of variables declaration//GEN-END:variables 
} 

TestFrame.java

public class TestFrame extends javax.swing.JFrame { 

    /** 
    * Creates new form TestFrame 
    */ 
    public TestFrame() { 
     initComponents(); 
     jPanel1.add(new DropDownPanel()); 
     jPanel1.add(new DropDownPanel()); 
     revalidate(); 
    } 

    /** 
    * 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">//GEN-BEGIN:initComponents 
    private void initComponents() { 

     jScrollPane1 = new javax.swing.JScrollPane(); 
     jPanel1 = new javax.swing.JPanel(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
     setMinimumSize(new java.awt.Dimension(400, 300)); 

     jPanel1.setLayout(new javax.swing.BoxLayout(jPanel1, javax.swing.BoxLayout.Y_AXIS)); 
     jScrollPane1.setViewportView(jPanel1); 

     getContentPane().add(jScrollPane1, java.awt.BorderLayout.CENTER); 

     pack(); 
    }// </editor-fold>//GEN-END:initComponents 

    /** 
    * @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(TestFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (InstantiationException ex) { 
      java.util.logging.Logger.getLogger(TestFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      java.util.logging.Logger.getLogger(TestFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
      java.util.logging.Logger.getLogger(TestFrame.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 TestFrame().setVisible(true); 
      } 
     }); 
    } 
    // Variables declaration - do not modify//GEN-BEGIN:variables 
    private javax.swing.JPanel jPanel1; 
    private javax.swing.JScrollPane jScrollPane1; 
    // End of variables declaration//GEN-END:variables 
} 

ответ

3

не уверен, из вашего вопроса, вы ...

или

или

  • Ribbon (с Substance Внешний вид и только)
+0

Я использовал пример «Expand/Collapsing JPanels»: теперь я использую GridBagLayout для jPanel1 внутри TestFrame. Теперь изменение видимости JPanel больше не влияет на другие JPanels. – Biggie

+0

@Biggie рада помочь вам – mKorbel

3

Это происходит потому, что вы себе t a минимальный размер для заголовка.
Итак, когда одна панель расширена, другая сжимается, потому что ее ребенок (заголовок) позволяет это сделать.

Не устанавливать какие-либо минимальный размер панели заголовка (в Netbeans IDE, нажмите Сброс по умолчанию кнопку)
и проблема должна исчезнуть.

Смежные вопросы