2017-08-03 2 views
0

Ich plane, ein GUI-Programm zu entwerfen, das den einen äußeren JPanel enthält, der viele wiederkehrende JPanel enthält, die Text und Button haben. Jedoch konnte ich nicht entscheiden, welche Layouts für diese Aufgabe geeignet sind. Ich möchte, dass es so ist nur kopiert und ersten JPanel eingefügt, die programmatisch wiedergekehrt werden, wie Sie auf dem Bild sehenWie wählt man die besten Layouts für verschachtelte JPanels?

enter image description here

I:. Welche Layouts sollte ich verwenden, um ein Ergebnis wie dieses zu erhalten?

+0

Das äußere Panel sollte ein vertikales 'BoxLayout' und das innere ein horizontales' BoxLayout' oder 'GridLayout' verwenden. Sehen Sie sich das [Tutorial] (https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html) an. Um eine definitive Antwort zu erhalten, müssen Sie das Größenänderungsverhalten angeben. – user1803551

+0

@ user1803551 danke für den Link, aber was meinen Sie mit "Größenanpassung Verhalten" – gingerdd

+0

Wenn Sie die Größe des Rahmens ändern, wie soll der Raum zwischen den Komponenten verteilt werden? – user1803551

Antwort

2

In meinem Kopf sieht es wie folgt aus:

JScrollPane>JPanel (outerPane)>JPanel (innerPane [many])

Auf dieser Grundlage müssen wir denken, die Layout-Manager ist die outerPane und die innerPane s verwenden gehen ...

um Abstand zwischen innerPane s bereitzustellen ich für GridLayout (rows, columns, hgap, vgap) wie gehen würde:

Jetzt

für jeden innerPane konnten wir für GridLayout, GridBagLayout oder FlowLayout gehen, mal sehen, was mit jedem passieren würde:

  • Wenn wir FlowLayout die verwendeten Komponenten nicht in einem „Gitter“ sein würde, oder " Tabelle“wie Layout, so ist es ein nein nein ... das ist, wie es aussehen würde:

    enter image description here

    Altough sie wie das, was wir brauchen scheint, ich bin nicht sicher, ob jedes Etikett GOI ist ng im Laufe der Zeit zu ändern oder nicht, aber man könnte versuchen ...

    • GridLayout Mit würde unsere JButton s macht den ganzen Raum der Zelle zu nehmen, und es würde nicht gut aussehen (zumindest, wenn es zu skalieren), hier ist ein Bild mit dem vor und nach dem GUI Ändern der Größe zu zeigen, was ich meine (geerntete nicht viel Platz in der Post zu benutzen):

    enter image description here

    Wenn Ihr GUI wird nicht die Größe Sie können mit diesem Pfad gehen, wenn es so ist, dann sollten Sie ein anderes Layout verwenden.

    • GridBagLayout ist in diesem Fall mein Favorit, weil jedes Etikett in ihrer eigenen Spalte bleiben und die Tasten werden alle verfügbaren Raum und unsere GUI wird wie das Bild, das Sie geschrieben aussehen nicht füllen:

    enter image description here

    In dem obigen Beispiel I verwendet, um eine Klasse CustomBorder Abstand zwischen den innerPane s zur Verfügung zu stellen und die outerPane während auch aa farbigen Rand sowie zeigt die vertikale JScrollPane alway bereitstellen s.

    Der Code, der diese Ausgaben erzeugt ist:

    package sof; 
    
    import java.awt.Color; 
    import java.awt.Component; 
    import java.awt.Graphics; 
    import java.awt.Graphics2D; 
    import java.awt.GridBagConstraints; 
    import java.awt.GridBagLayout; 
    import java.awt.GridLayout; 
    import java.awt.Insets; 
    import java.awt.geom.Rectangle2D; 
    
    import javax.swing.BorderFactory; 
    import javax.swing.JButton; 
    import javax.swing.JFrame; 
    import javax.swing.JLabel; 
    import javax.swing.JPanel; 
    import javax.swing.JScrollPane; 
    import javax.swing.SwingUtilities; 
    import javax.swing.border.AbstractBorder; 
    
    public class NestedPanels { 
        private JFrame frame; 
        private JPanel outerPane; 
        private JPanel innerPane; 
        private GridBagConstraints gbc; 
        private JScrollPane scrollPane; 
    
        public static void main(String[] args) { 
         SwingUtilities.invokeLater(new NestedPanels()::createAndShowGui); 
        } 
    
        private void createAndShowGui() { 
         frame = new JFrame(getClass().getSimpleName()); 
    
         outerPane = new JPanel(); 
         outerPane.setLayout(new GridLayout(0, 1, 5, 5)); 
    
         for (int i = 0; i < 5; i++) { 
          innerPane = new JPanel(); 
          innerPane.setLayout(new GridBagLayout()); 
    
          gbc = new GridBagConstraints(); 
    
          gbc.gridx = 0; 
          gbc.gridy = 0; 
          gbc.fill = GridBagConstraints.BOTH; 
          gbc.insets = new Insets(10, 10, 10, 10); 
    
          innerPane.add(new JLabel("Recurring JLabel1"), gbc); 
    
          gbc.gridx++; 
          innerPane.add(new JLabel("Recurring JLabel2"), gbc); 
          gbc.gridx++; 
          innerPane.add(new JLabel("Recurring JLabel3"), gbc); 
          gbc.gridx++; 
          innerPane.add(new JButton("Recurring JButton1"), gbc); 
    
          innerPane.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 
    
          outerPane.add(innerPane); 
         } 
         outerPane.setBorder(new CustomBorder(5, Color.BLACK)); 
    
         scrollPane = new JScrollPane(outerPane, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
    
         frame.add(scrollPane); 
         frame.pack(); 
         frame.setVisible(true); 
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        } 
    
        @SuppressWarnings("serial") 
        class CustomBorder extends AbstractBorder { 
         private int gap; 
         private Color color; 
         public CustomBorder(int gap, Color color) { 
          this.gap = gap; 
          this.color = color; 
         } 
    
         @Override 
         public Insets getBorderInsets(Component c) { 
          return new Insets(gap, gap, gap, gap); 
         } 
    
         @Override 
         public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { 
          super.paintBorder(c, g, x, y, width, height); 
          Graphics2D g2d = (Graphics2D) g; 
          g2d.setColor(color); 
          g2d.draw(new Rectangle2D.Double(x, y, width - 1, height - 1)); 
         } 
        } 
    } 
    

Spiele mit den Rahmenart den gewünschten zu bekommen, malte ich die Grenze mit einer -1 Pixel auf der GUI, wenn ich didn‘ t es würde nur links und oben Grenzen zeigen ...

  • wäre eine weitere Option ein JTable verwenden, aber ich überlasse das Ihnen
Verwandte Themen