2017-09-12 10 views
0

Ich möchte einen Java-Code erstellen, wo ich beliebig viele Panels einfügen kann. Damit kann ich nach unten scrollen, um die Panels zu sehen. Ich bin so weit gerade: Aber mein Problem ist, ich kann nicht nach unten scrollen. Ich habe das JScrollPane mit JTextAreas getestet, was gut funktioniert hat.Java JScrollPane ve

Picture of my Program

package test; 

import java.awt.*; 
import javax.swing.*; 

public class Scrollbar { 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     JPanel panel = new JPanel(); 
     JPanel panel1 = new JPanel(); 
     JPanel panel2 = new JPanel(); 
     JPanel panel3 = new JPanel(); 
     JTextField tFId = new JTextField("ID: ", 5); 
     JTextField tFName = new JTextField("Name: ", 5); 
     JTextField tFHersteller = new JTextField("Hersteller: ", 5); 
     JTextField tFId2 = new JTextField("ID: ", 5); 
     JTextField tFName2 = new JTextField("Name: ", 5); 
     JTextField tFHersteller2 = new JTextField("Hersteller: ", 5); 
     JTextField tFId3 = new JTextField("ID: ", 5); 
     JTextField tFName3 = new JTextField("Name: ", 5); 
     JTextField tFHersteller3 = new JTextField("Hersteller: ", 5); 

     frame.setSize(400, 400); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLayout(new FlowLayout()); 

     panel.setLayout(new FlowLayout()); 
     panel.setPreferredSize(new Dimension(200, 85)); 
     panel.add(panel1); 
     panel.add(panel2); 
     panel.add(panel3); 
     JScrollPane scrollPanel = new JScrollPane(panel, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 

     panel1.setLayout(new FlowLayout()); 
     panel1.add(tFId); 
     panel1.add(tFName); 
     panel1.add(tFHersteller); 

     panel2.setLayout(new FlowLayout()); 
     panel2.add(tFId2); 
     panel2.add(tFName2); 
     panel2.add(tFHersteller2); 

     panel3.setLayout(new FlowLayout()); 
     panel3.add(tFId3); 
     panel3.add(tFName3); 
     panel3.add(tFHersteller3); 

     frame.add(scrollPanel); 
     frame.setVisible(true); 
    } 
} 

Antwort

0

Du Flowüber verwenden.

Verschiedene Layouts haben unterschiedliche Verhaltensweisen. Zuerst müssen Sie diese Zeile entfernen:

Das Standardlayout für den Inhalt eines Rahmens ist ein BorderLayout. Sie möchten es so belassen, da eine Komponente, die zu einem BorderLayout ohne Einschränkungen hinzugefügt wurde, in der Mitte platziert wird, wo sie gedehnt wird, um den gesamten Bereich auszufüllen.

Zweitens wollen Sie diese entfernen:

panel.setLayout(new FlowLayout()); 
panel.setPreferredSize(new Dimension(200, 85)); 

Einstellen der bevorzugten Größe stört die JScrollPane Fähigkeit, seine Ansicht zu verwalten (das heißt, panel). Wenn Sie möchten, dass Ihre Komponenten in mehreren Zeilen angezeigt werden, sollten Sie versuchen, FlowLayout dazu zu zwingen, die Breite zu beschränken. Verwenden Sie stattdessen ein Layout, das Komponenten in verschiedenen Zeilen platzieren soll. Die beste Wahl ist GridBagLayout:

panel.setLayout(new GridBagLayout()); 
GridBagConstraints gbc = new GridBagConstraints(); 
gbc.gridwidth = GridBagConstraints.REMAINDER; 
panel.add(panel1, gbc); 
panel.add(panel2, gbc); 
gbc.weighty = 1; 
gbc.anchor = GridBagConstraints.NORTH; 
panel.add(panel3, gbc); 

Die Verwendung von GridBagConstraints.REMAINDER in einem Constraint dem GridBagLayout erzählt eine untergeordnete Komponente eine ganze Zeile einnehmen zu machen.

Die Verwendung von weighty = 1 teilt dem GridBagLayout mit, dass die Rasterzelle des Kindes, das hinzugefügt werden soll, den gesamten zusätzlichen vertikalen Platz einnehmen sollte, wenn das Feld größer als seine untergeordneten Elemente ist. Schließlich behält GridBagConstraints.NORTH das Kind an der Spitze dieser gestreckten Gitterzelle, egal wie hoch die Gitterzelle ist.

Verwandte Themen