2014-07-10 30 views
4

我想填写一个JPanel其布局是GridLayout,如果这是不可能的使用GridLayout我想知道如果使用GridBagLayout是可能的和如何?如何用GridLayout或GridBagLayout垂直填充JPanel?

下面的代码:

public class NestedLayoutExample { 

public static void main(String[] args) { 

    Runnable r = new Runnable() { 

     @Override 
     public void run() { 
      final JFrame frame = new JFrame("Nested Layout Example"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setMinimumSize(new Dimension(300, 400)); 

      final JPanel gui = new JPanel(new BorderLayout(5,5)); 
      gui.setBorder(new TitledBorder("BorderLayout(5,5)")); 

      JPanel dynamicLabels = new JPanel(new BorderLayout(4,4)); 
      dynamicLabels.setBorder(new TitledBorder("BorderLayout(4,4)")); 
      gui.add(dynamicLabels, BorderLayout.CENTER); 

      final JPanel labels = new JPanel(new GridLayout(4,0,3,3)); 
      labels.setBorder(new TitledBorder("GridLayout(0,2,3,3)")); 

      JButton addNew = new JButton("Add Another Label"); 
      dynamicLabels.add(addNew, BorderLayout.NORTH); 
      addNew.addActionListener(new ActionListener(){ 
       private int labelCount = 0; 

       @Override 
       public void actionPerformed(ActionEvent ae) { 
        labels.add(new JLabel("Label " + ++labelCount)); 
        frame.validate(); 
       } 
      }); 

      dynamicLabels.add(new JScrollPane(labels), BorderLayout.CENTER); 

      frame.setContentPane(gui); 
      frame.pack(); 
      frame.setLocationRelativeTo(null); 
      try { 
       // 1.6+ 
       frame.setLocationByPlatform(true); 
       frame.setMinimumSize(frame.getSize()); 
      } catch(Throwable ignoreAndContinue) {} 

      frame.setVisible(true); 
     } 
    }; 
    SwingUtilities.invokeLater(r); 
}} 

这是我得到上面的代码:

enter image description here

而这正是我想要的:

enter image description here

而且想知道更好的方法来d它。

+2

从[布局管理器视觉指南]开始(http:// docs .oracle.com/javase/tutorial/uiswing/layout/visual.html)并熟悉一下当一个布局比另一个更适合使用(即:'GridLayout'或'GridBagLayout')。如果您仍然无法理解说明,请运行演示。演示涵盖了您所要求的基本使用方法问题。 –

+1

@DavidYee好的,但我为我需要的GridLayout很好,我只是想知道,如果我可以垂直填充使用该布局的JPanel –

+0

你的意思是你想'actionPerformed'方法添加'JLabels'是垂直填充?你关心行或列吗? – MadProgrammer

回答

5

这是“轻微的”一步方向的寻找......

GridBagLayout

如果你想要的工作有点更像GridLayout(这样的第一个系列的标签出现在顶部/左边),您将不得不包含一些构成初始网格的“填充”对象...

import java.awt.BorderLayout; 
import java.awt.ComponentOrientation; 
import java.awt.Dimension; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
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.TitledBorder; 

public class NestedLayoutExample { 

    public static void main(String[] args) { 

     Runnable r = new Runnable() { 

      @Override 
      public void run() { 
       final JFrame frame = new JFrame("Nested Layout Example"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setMinimumSize(new Dimension(300, 400)); 

       final JPanel gui = new JPanel(new BorderLayout(5, 5)); 
       gui.setBorder(new TitledBorder("BorderLayout(5,5)")); 

       JPanel dynamicLabels = new JPanel(new BorderLayout(4, 4)); 
       dynamicLabels.setBorder(new TitledBorder("BorderLayout(4,4)")); 
       gui.add(dynamicLabels, BorderLayout.CENTER); 

       final JPanel labels = new JPanel(new GridBagLayout()); 
       labels.setBorder(new TitledBorder("GridLayout(0,2,3,3)")); 

       JButton addNew = new JButton("Add Another Label"); 
       dynamicLabels.add(addNew, BorderLayout.NORTH); 
       addNew.addActionListener(new ActionListener() { 

        private int labelCount = 0; 
        private int gridx = 0; 
        private int gridy = 0; 

        @Override 
        public void actionPerformed(ActionEvent ae) { 
         GridBagConstraints gbc = new GridBagConstraints(); 
         gbc.weightx = 1; 
         gbc.weighty = 1; 
         gbc.gridx = gridx; 
         gbc.gridy = gridy; 
         labels.add(new JLabel("Label " + ++labelCount), gbc); 
         labels.revalidate(); 

         gridy++; 
         if (gridy >= 4) { 
          gridy = 0; 
          gridx++; 
         } 
        } 
       }); 

       dynamicLabels.add(new JScrollPane(labels), BorderLayout.CENTER); 

       frame.setContentPane(gui); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       try { 
        // 1.6+ 
        frame.setLocationByPlatform(true); 
        frame.setMinimumSize(frame.getSize()); 
       } catch (Throwable ignoreAndContinue) { 
       } 

       frame.setVisible(true); 
      } 
     }; 
     SwingUtilities.invokeLater(r); 
    } 
} 
+0

嘿,非常感谢,但是现在你能否向我解释GridBagConstraints是如何工作的?它是什么? –

+0

'GridBagConstraints'告诉'GridBagLayout'应该如何布局相关的组件。看看[如何使用GridBagLayout](http://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html)了解更多详情 – MadProgrammer

+0

好的,真的非常感谢MadProgrammer,你真酷! –