2

SwingLayout を使用した Swing プログラムがあります。Swing コンポーネントの構造は次のようになります。

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

私の問題は、チェックボックスパネルが大きくなるのを防ぐ方法がわからないことです。右側にある列を「押し出す」ことはしたくありません。チェックボックス パネルが大きくなりすぎた場合に、Wraplayout (オプション パネルで正常に動作) でそのコンテンツをラップするようにします。

これは、Eclipse 内の Windowsbuilder GUI からのビューです。「sites」というラベルが付いたパネルは、チェックボックス パネルです。チェックボックス パネルのすぐ右側にはオプション パネルがあります。両方を含む大きなパネルがメインパネルです。 http://i.imgur.com/S7Njo.png

チェックボックスを追加しすぎるとこうなります http://i.imgur.com/f2SZz.png

私の主な問題は、メインパネルの最初の列の列制約に「grow 0」を設定しても、サイトパネルに新しいチェックボックスを追加するときに内部のコンポーネントが大きくなりすぎたときに、列の制限が妨げられない理由がわからないことです(サイトパネルには、任意の数のチェックボックスを含めることができます)。

これは、メイン パネルのマイレイアウトです。

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です。以下のソースをつかむことができます。必要な唯一の依存関係は milayout です。ボタンをクリックして、チェックボックスを追加できます。

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();
        }
    }
}
4

1 に答える 1

4

理論的には、セットアップは期待どおりに機能するはずです-レイアウトを伝えれば

  • 最大値をパーセンテージに設定することにより、最初の列が最大値を超えて成長しないようにする
  • 列の制約で min を pref に設定することにより、その pref の下で optionPanel 列を縮小しないようにします。

列の制約の例:

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

実際には、FlowLayout と MigLayout をどのような制約によってもうまく連携させることができませんでした。最初のレイアウトでさえ壊れています (optionPanel がフレーム幅から押し出された場合)。FlowLayout をRob の WrapLayoutに置き換えると見栄えが良くなりますが、ボックスが互いに完全に整列していないため、完全に最適というわけではありません。

/*
 * 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();
        }
    }
}
于 2012-09-12T10:37:34.177 に答える