2012-09-11 40 views
2

我有一个使用SwingLayout的Swing程序。 Swing组件的结构如下所示。使用miglayout和嵌套面板的Swing布局

JFrame 
    JPanel (Cardlayout) 
     JPanel (Miglayout) - Main panel 
      Jpanel (Flowlayout) - Checkbox Panel 
      JPanel (Flowlayout) - Option Panel 

我现在的问题是,我不知道如何防止复选框面板增长。我不希望它“推”出它在右边的列。我想Wraplayout(可在选项面板上正常工作)在复选框面板的内容过大时将其封装起来。

这是从Eclipse的WindowsBuilder GUI中查看它的视图。其中带有“网站”标签的面板是复选框面板。直接在复选框面板的右侧是选项面板。包含它们的大面板是主面板。 http://i.imgur.com/S7Njo.png

这是当我添加了太多的复选框 http://i.imgur.com/f2SZz.png

我的主要问题是什么情况是,我不明白为什么设置在mainPanel中第一列没有按在列约束“成长0””当内部组件变得太大时,防止它增长,因为我向站点面板添加了新的复选框(站点面板可以有任意数量的复选框)。

这是我的主面板miglayout。

mainPanel.setLayout(new MigLayout("", "[][grow]", "[][][][][][][][grow]")); 

这里是我的,当我添加复选框面板

siteCheckBoxPanel = new JPanel(); 
mainPanel.add(siteCheckBoxPanel, "cell 0 0,alignx left,gapx 0px,aligny center"); 
siteCheckBoxPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5)); 

我也尝试过不流布局的构成要素的制约,而不能解决任何事情。任何你可以提供的见解都会很棒!如果有问题,我也很乐意提供更多信息。仅供参考我也尝试过“复选框面板”所在单元的列和行约束条件下的“增长0”。

这是一个SSCCE。你可以抓住下面的来源。你需要的唯一依赖是miglayout。您可以点击按钮来添加复选框。

https://dl.dropbox.com/u/20614368/Test.java

import java.awt.CardLayout; 
import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 

import javax.swing.AbstractAction; 
import javax.swing.Action; 
import javax.swing.JButton; 
import javax.swing.JCheckBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextArea; 
import javax.swing.border.EmptyBorder; 

import net.miginfocom.swing.MigLayout; 


public class Test extends JFrame { 


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

      public void run() { 
       try { 
        frame = new Test(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    private JPanel contentPane; 
    private JPanel mainPanel; 
    private JPanel optionPanel; 
    private JButton btnUploadImages; 
    private JLabel thumbnailLabel; 
    private JTextArea textArea; 
    private JPanel checkboxPanel; 
    private final Action action = new SwingAction(); 

    /** 
    * Create the frame. 
    */ 
    public Test() { 
     setVisible(true); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 1098, 846); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     setContentPane(contentPane); 
     contentPane.setLayout(new CardLayout(0, 0)); 

     mainPanel = new JPanel(); 
     mainPanel.setName(""); 
     contentPane.add(mainPanel, "name_329556913535654"); 
     mainPanel.setLayout(new MigLayout("", "[][grow]", "[][][][][][][][grow]")); 


     JLabel lblPicture = new JLabel("Picture"); 
     mainPanel.add(lblPicture, "cell 0 1"); 

     optionPanel = new JPanel(); 
     optionPanel.setBackground(Color.red); 
     mainPanel.add(optionPanel, "cell 1 0 1 5,grow"); 

     btnUploadImages = new JButton("Upload Images"); 
     btnUploadImages.setAction(action); 

     thumbnailLabel = new JLabel(""); 
     mainPanel.add(thumbnailLabel, "cell 0 4"); 

     textArea = new JTextArea(); 
     mainPanel.add(btnUploadImages, "cell 0 6"); 

     checkboxPanel = new JPanel(); 
     checkboxPanel.setBackground(Color.green); 
     mainPanel.add(checkboxPanel, "flowx,cell 0 0"); 

     JLabel lblSites = new JLabel("Sites"); 
     checkboxPanel.add(lblSites); 


    } 
    private class SwingAction extends AbstractAction { 
     public SwingAction() { 
      putValue(NAME, "Add checkbox"); 
      putValue(SHORT_DESCRIPTION, "Some short description"); 
     } 
     public void actionPerformed(ActionEvent e) { 
      JCheckBox box = new JCheckBox(); 
      box.setName("Foobar!"); 
      checkboxPanel.add(box); 
      contentPane.validate(); 
      contentPane.repaint(); 
     } 
    } 
} 
+0

尽管我明白你在说什么,如果你提供一个[http:// sscce。org /](SSCCE),提供工作解决方案会更容易。 –

+0

好吧,让我工作一个! :) – Jazzepi

+0

好吧,我添加了一个SSCCE! – Jazzepi

回答

4

从理论上说,你希望你的设置应工作 - 只要你告诉布局

  • 不会增长到一个最大值,f.i.第一列通过将最大值设置为百分比
  • 不缩小其pref,f.i下的optionPanel列。通过在列约束最小设置为PREF

例如列约束:

// first column - restrict max 
"[grow, fill, n:pref:30%]" + 
// second column - restrict min 
"[grow, pref:pref:n]" 

实际上,我不能做的FlowLayout和MigLayout良好地合作以任何约束:即使初始布局被打破(fi optionPanel推出框架宽度)。由Rob's WrapLayout替代FlowLayout看起来更好,虽然不完全最佳,因为箱子并未完全对齐。

/* 
* Created on 12.09.2012 
* 
*/ 
package layout; 

import java.awt.CardLayout; 
import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 

import javax.swing.AbstractAction; 
import javax.swing.Action; 
import javax.swing.JButton; 
import javax.swing.JCheckBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextArea; 
import javax.swing.border.EmptyBorder; 

import net.miginfocom.swing.MigLayout; 

public class MigLayoutNested extends JFrame { 


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

      public void run() { 
       try { 
        frame = new MigLayoutNested(); 
        frame.pack(); 
//     frame.setSize(frame.getWidth(), frame.getHeight()* 2); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    private JPanel contentPane; 
    private JPanel mainPanel; 
    private JPanel optionPanel; 
    private JButton btnUploadImages; 
    private JLabel thumbnailLabel; 
    private JTextArea textArea; 
    private JPanel checkboxPanel; 
    private final Action action = new SwingAction(); 

    /** 
    * Create the frame. 
    */ 
    public MigLayoutNested() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     contentPane = (JPanel) getContentPane(); //new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     contentPane.setLayout(new CardLayout(0, 0)); 

     mainPanel = new JPanel(); 
     contentPane.add(mainPanel, "name_329556913535654"); 

     mainPanel.setLayout(new MigLayout("debug", 
       "[grow, fill][grow, pref:pref:n]" 
       , "[grow, fill][][][][][][][grow]" 
       )); 

     // stand-in to simulate a row-spanning all-growing component 
     optionPanel = new JPanel(); 
     ((FlowLayout) optionPanel.getLayout()).setAlignment(JLabel.RIGHT); 
     JLabel option = new JLabel("just some label so we see the trailing corner, long enough"); 
     optionPanel.add(option); 
     optionPanel.setBackground(Color.YELLOW); 
     mainPanel.add(optionPanel, "cell 1 0 1 5, grow"); 

     // the panel to dynamically add components to 
     // expected behaviour is to wrap on revalidate if needed 
     // not working with FlowLayout, but looks half-way fine 
     // with Rob's WrapLayout 
     checkboxPanel = new JPanel(new WrapLayout()); 
     checkboxPanel.setBackground(Color.green); 
     JLabel lblSites = new JLabel("Sites"); 
     checkboxPanel.add(lblSites); 
     mainPanel.add(checkboxPanel, "cell 0 0"); 

     JLabel lblPicture = new JLabel("Picture"); 
     mainPanel.add(lblPicture, "cell 0 1"); 

     thumbnailLabel = new JLabel("thumb"); 
     mainPanel.add(thumbnailLabel, "cell 0 3"); 
     textArea = new JTextArea(10, 10); 
     mainPanel.add(textArea, "cell 0 4"); 

     btnUploadImages = new JButton("Upload Images"); 
     btnUploadImages.setAction(action); 
     mainPanel.add(btnUploadImages, "cell 0 6"); 


    } 
    private class SwingAction extends AbstractAction { 
     public SwingAction() { 
      putValue(NAME, "Add checkbox"); 
      putValue(SHORT_DESCRIPTION, "Some short description"); 
     } 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      JCheckBox box = new JCheckBox(); 
      box.setName("Foobar!"); 
      checkboxPanel.add(box); 
      checkboxPanel.revalidate(); 
     } 
    } 
} 
+0

太棒了!这基本上是我想要的。我不得不通过改变代码中的列约束来匹配示例列约束来摆弄所提供的代码。这是mainPanel布局看起来像我修饰它以匹配您提供的列约束后的样子。 mainPanel.setLayout(new MigLayout(“debug”, “[grow,fill,n:pref:20%] [grow,pref:pref:n]” ,“[grow,fill] [] [] [] [ ] [] [] [grow]“ )); – Jazzepi

+0

另外,我可以在将左对齐常量添加到WrapLayout构造函数后很好地排列它们。你可以在这里看到效果http://imgur.com/uLggo checkboxPanel = new JPanel(new WrapLayout(WrapLayout.LEFT)); – Jazzepi

+0

很高兴你做到了:-)个人而言,我宁愿所有复选框与第一行中的复选框对齐。但是这对于简单的LayoutManager来说已经不起作用了。可惜Mig不支持包装(或者只有我没有找到该选项..) – kleopatra