2012-08-06 123 views
0

我创建了500,500大小的小框架,在我的框架中我还添加了面板,我已经动态添加了标签和文本框,我在面板中添加了10个标签正确,但是我将再增加5个标签和文本框延续上面添加的标签是指5个标签和文本框的都躲起来,所以如何我EXTENDS画面的高度后,自动如何在java swing中自动扩展框架的高度

+0

考虑将标签在面板处于'JScrollPane'代替,如在[这个例子]的标记看出(http://stackoverflow.com/a/5630271/418556)。 – 2012-08-06 07:01:29

回答

0

有没有布尔您可以设置为true以使框架自动增长。

每次添加内容时,您可能都希望在内容面板上执行getPreferredSize(),并执行frame.setSize(...)以适应新组件。

这里有一个演示

public class FrameTestBase { 

    public static void main(String args[]) { 
     final JFrame t = new JFrame(); 

     t.getContentPane().setLayout(new GridLayout(-1, 1)); 

     t.add(new JButton(new AbstractAction("Add label") { 
      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       t.getContentPane().add(new JLabel("hello")); 

       // Auto-adjust height. 
       Dimension dim = t.getContentPane().getPreferredSize(); 
       dim.width = 500; 
       t.setSize(dim); 
      } 
     })); 

     t.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     t.setSize(500, 500); 
     t.setVisible(true); 
    } 
} 
+0

谢谢你的回应。 – 2012-08-06 09:31:46

3

调用.pack()方法应该做的伎俩:

公共无效包()

原因调整此窗口,以适应首选大小和布局 其子组件。如果任一维的最小尺寸小于前面调用setMinimumSize 方法所指定的最小尺寸,则窗口的最终宽度和高度为 。如果窗口和/或其所有者尚不可显示,则在计算首选大小之前,它们都可以显示。 窗口在计算大小后进行验证。

+0

请注意,这也会改变宽度。 – aioobe 2012-08-06 06:32:35

+0

@aioobe:如果组件符合长度明智,不应该保持不变吗? – npinti 2012-08-06 06:38:20

+0

没有。如果可能,'pack'会缩小宽度。 – aioobe 2012-08-06 06:43:48

2

有几个重要的rulles和所需知识的LayoutManager如何混凝土工程与最小值,最大值和PREFERREDSIZE从孩子的来到

  1. 我强烈建议添加(re)validate()repaint()对于已经可见Container

  2. JScrollPane使用作为第一JComponent加到JFrame/JDialog/JWindow并用至determin E对于JFrame最大尺寸(最可能是从显示分辨率),请不要在超过最大大小的情况下使用pack(),否则容器边界可能被淘汰的屏幕

代码示例中,必须添加规则在第二点。

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JCheckBox; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.LineBorder; 

public class AddComponentsAtRuntime { 

    private JFrame f; 
    private Container panel; 
    private JCheckBox checkValidate, checkReValidate, checkRepaint, checkPack; 

    public AddComponentsAtRuntime() { 
     JButton b = new JButton(); 
     b.setBackground(Color.red); 
     b.setBorder(new LineBorder(Color.black, 2)); 
     b.setPreferredSize(new Dimension(600, 10)); 
     panel = new Container(); 
     panel.setLayout(new GridLayout(0, 1)); 
     panel.add(b); 
     f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(panel, "Center"); 
     f.add(getCheckBoxPanel(), "South"); 
     f.setLocation(200, 200); 
     f.pack(); 
     f.setVisible(true); 
    } 

    private JPanel getCheckBoxPanel() { 
     checkValidate = new JCheckBox("validate"); 
     checkValidate.setSelected(false); 
     checkReValidate = new JCheckBox("revalidate"); 
     checkReValidate.setSelected(false); 
     checkRepaint = new JCheckBox("repaint"); 
     checkRepaint.setSelected(false); 
     checkPack = new JCheckBox("pack"); 
     checkPack.setSelected(false); 
     JButton addComp = new JButton("Add New One"); 
     addComp.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       JButton b = new JButton(); 
       b.setBackground(Color.red); 
       b.setBorder(new LineBorder(Color.black, 2)); 
       b.setPreferredSize(new Dimension(600, 10)); 
       panel.add(b); 
       makeChange(); 
       System.out.println(" Components Count after Adds :" + panel.getComponentCount()); 
      } 
     }); 
     JButton removeComp = new JButton("Remove One"); 
     removeComp.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       int count = panel.getComponentCount(); 
       if (count > 0) { 
        panel.remove(0); 
       } 
       makeChange(); 
       System.out.println(" Components Count after Removes :" + panel.getComponentCount()); 
      } 
     }); 
     JPanel panel2 = new JPanel(); 
     panel2.add(checkValidate); 
     panel2.add(checkReValidate); 
     panel2.add(checkRepaint); 
     panel2.add(checkPack); 
     panel2.add(addComp); 
     panel2.add(removeComp); 
     return panel2; 
    } 

    private void makeChange() { 
     if (checkValidate.isSelected()) { 
      panel.validate(); 
     } 
     if (checkReValidate.isSelected()) { 
      panel.revalidate(); 
     } 
     if (checkRepaint.isSelected()) { 
      panel.repaint(); 
     } 
     if (checkPack.isSelected()) { 
      f.pack(); 
     } 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       AddComponentsAtRuntime makingChanges = new AddComponentsAtRuntime(); 
      } 
     }); 
    } 
} 
+0

这需要我要感谢您korbel – 2012-08-06 09:32:19