2016-05-04 5 views
0

Ich bin interessiert an einen Container erstellen, die Schaltflächen dynamisch erhalten. Wenn die Containerbreite erreicht ist, werden die Schaltflächen unterhalb der ersten Schaltflächenzeile eingefügt und eine vertikale Bildlaufleiste muss angezeigt werden. Obwohl die horizontale Bildlaufleiste nicht angezeigt werden kann, könnte der Container horizontal skalierbar sein. Als Beispiel: enter image description hereJPanel und JScrollPane mit nur vertikalen Blättern

Mit Klick auf jbutton1 fügen Sie neue Schaltflächen entsprechend der Panelgröße hinzu. In diesem Bild ist es nicht möglich, die vertikale Bildlaufleiste zu sehen, und das ist das Problem.

Der Code, den ich verwendet wird, ist der Balg ein:

/* 
* To change this license header, choose License Headers in Project Properties. 
* To change this template file, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package ScrollPanelTest; 

import java.awt.ComponentOrientation; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import javax.swing.AbstractAction; 
import javax.swing.JButton; 
import javax.swing.JScrollBar; 

/** 
* 
* @author leandro.lima 
*/ 
public class ScrollPane extends javax.swing.JFrame { 

    public int count = 1; 
    private WrapLayout layout = new WrapLayout(FlowLayout.LEADING, 5, 5); 

    /** 
    * Creates new form ScrollPane 
    */ 
    public ScrollPane() { 
     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() { 

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

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     jButton1.setText("jButton1"); 
     jButton1.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       jButton1ActionPerformed(evt); 
      } 
     }); 

     jPanel1.setBackground(new java.awt.Color(255, 255, 255)); 
     jPanel1.setMinimumSize(new java.awt.Dimension(0, 0)); 
     jPanel1.setPreferredSize(new java.awt.Dimension(0, 0)); 
     java.awt.FlowLayout flowLayout1 = new java.awt.FlowLayout(); 
     flowLayout1.setAlignOnBaseline(true); 
     jPanel1.setLayout(flowLayout1); 
     jScrollPane1.setViewportView(jPanel1); 
     jPanel1.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addComponent(jButton1) 
       .addContainerGap(327, Short.MAX_VALUE)) 
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addComponent(jScrollPane1)) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addContainerGap(163, Short.MAX_VALUE) 
       .addComponent(jButton1)) 
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addGroup(layout.createSequentialGroup() 
        .addComponent(jScrollPane1) 
        .addGap(34, 34, 34))) 
     ); 

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

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
     final JButton button = new JButton(); 
     button.setPreferredSize(new Dimension(100, 100)); 
     button.setSize(new Dimension(100, 100)); 

     button.setAction(new AbstractAction("<html><center><h4>Button " + (count++) + "</h4><br>Remove me</center></html>") { 
      @Override 
      public void actionPerformed(ActionEvent ae) { 
       jPanel1.remove(button); 
       jPanel1.getRootPane().repaint(); 
       getContentPane().repaint(); 
      } 
     }); 

     jPanel1.add(button); 
     jPanel1.getRootPane().repaint(); 
     getContentPane().repaint(); 
    }           

    /** 
    * @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 ("Windows".equals(info.getName())) { 
        javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
     } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) { 

     } 
     //</editor-fold> 

     //</editor-fold> 

     /* Create and display the form */ 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new ScrollPane().setVisible(true); 
      } 
     }); 
    } 

    // Variables declaration - do not modify      
    private javax.swing.JButton jButton1; 
    private javax.swing.JPanel jPanel1; 
    private javax.swing.JScrollPane jScrollPane1; 
    // End of variables declaration     
} 

Obs: Ich konnte nicht einen Weg finden, die Platte neu zu zeichnen, wenn die Tasten sind hinzufügen, wenn Sie wissen, bitte zeigen Sie mir auch.

Danke!

Antwort

3
jPanel1.setLayout(flowLayout1); 
    jScrollPane1.setViewportView(jPanel1); 

Sie verwenden ein FlowLayout im Panel. Ein FlowLayout berechnet die bevorzugte Größe eines Panels NICHT neu. Da sich die bevorzugte Größe niemals ändert, wird die vertikale Bildlaufleiste nie angezeigt.

Deshalb müssen Sie die WrapLayout auf Ihrem Panel verwenden.

Sie definieren eine WrapLayout Variable, aber Sie verwenden nie die WrapLayout auf dem Panel.

Auch ich habe keine Ahnung, warum Sie ein GroupLayout für etwas so einfach verwenden. Der Standard-Layout-Manager für einen Rahmen ist ein BorderLayout. Erstellen Sie einfach das Scrollpanel mit dem Panel und fügen Sie das Scrollpane zum BorderLayout.CENTER hinzu. Dann fügen Sie das andere Feld mit der Schaltfläche zum BorderLayout.PAGE_END hinzu. Seine zwei Codezeilen. Lernen Sie, wie Sie Ihre eigenen GUI's erstellen und sich nicht auf den komplexen Code verlassen, der von der IDE generiert wird.

Ich konnte keinen Weg finden, das Panel neu zu streichen, wenn Tasten hinzugefügt werden, wenn Sie wissen, bitte zeigen Sie mir auch.

Wenn Sie hinzufügen (oder entfernen) Komponenten aus einer sichtbaren GUI dann wird die Basis-Code ist:

panel.add(...); 
panel.revalidate(); 
panel.repaint();