4

3 つの JPanel p1 p2 と p3 を用意して、次のように配置したいと考えています。

レイアウト
FlowLayout、BoxLayout などで遊んでいますが、正しい方向に向かっているかどうかはよくわかりません。私は Java にまったく慣れていないので、正直なところ、何が何をするのかわかりません。

パネルのサイズを変更する BoxLayout の仕組みが気に入っていますが、何らかの幅属性を指定できるようにしたいと考えています。

これにはビジュアルデザイナーを使用していません。これは現時点での私のウィンドウコードです:

private void initialize() {
    Dimension dimensions = Toolkit.getDefaultToolkit().getScreenSize();

    frame = new JFrame();
    frame.setLayout(new GridLayout(1, 3));
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(dimensions.width / 2 - WINDOW_WIDTH / 2,
            dimensions.height / 2 - WINDOW_HEIGHT / 2, 
            WINDOW_WIDTH, WINDOW_HEIGHT);

    JPanel p1 = new JPanel(new BorderLayout());
    p1.setBackground(Color.red);

    JPanel p2 = new JPanel(new BorderLayout());
    p2.setBackground(Color.black);  

    JPanel p3 = new JPanel(new BorderLayout());
    p3.setBackground(Color.blue);       

    frame.add(p2);

    frame.add(p1);  
    frame.add(p3);
}

任意のポインタをいただければ幸いです!

編集: mKorbel のおかげで、思い通りに動作させることができました。右側の列は意図したとおりにレイアウトされていませんが、実際には気が変わって、他のレイアウトを維持することにしました。

パネルウィンドウ
コード:

import java.awt.*;
import javax.swing.*;

public class PanelWindow extends JFrame {

    private static final long serialVersionUID = 1L;
    private static final int WINDOW_HEIGHT = 600;
    private static final int WINDOW_WIDTH = 800;
    private JPanel p1, p2, p3;

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                PanelWindow panelWindow = new PanelWindow(); 
            }
        });
    }

    public PanelWindow() {
        initialize();
    }

    private void initialize() {
        setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();

        p1 = new JPanel();
        p1.setBackground(Color.red);
        p2 = new JPanel();
        p2.setBackground(Color.green);
        p3 = new JPanel();
        p3.setBackground(Color.blue);

        gbc.gridx = gbc.gridy = 0;
        gbc.gridwidth = gbc.gridheight = 1;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.anchor = GridBagConstraints.NORTHWEST;
        gbc.weightx = gbc.weighty = 97;
        gbc.insets = new Insets(2, 2, 2, 2);
        add(p1, gbc);

        gbc.gridy = 1;
        gbc.weightx = gbc.weighty = 3;
        gbc.insets = new Insets(2, 2, 2, 2);
        add(p2, gbc);

        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.gridwidth = 1;
        gbc.gridheight = 2;
        gbc.weightx = 20;
        gbc.insets = new Insets(2, 2, 2, 2);
        add(p3, gbc);

        pack();
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Dimension dimensions = Toolkit.getDefaultToolkit().getScreenSize();
        setBounds(dimensions.width / 2 - WINDOW_WIDTH / 2,
            dimensions.height / 2 - WINDOW_HEIGHT / 2, 
            WINDOW_WIDTH, WINDOW_HEIGHT);

        setTitle("Panel Window");
    }
}
4

2 に答える 2

7

私のお気に入りのLayoutManagerではありません。たとえば、GridBagLayoutを使用すると、 MigLayoutを使用するのが最も簡単かもしれません...

ここに画像の説明を入力ここに画像の説明を入力

ここに画像の説明を入力

import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;

public class BorderPanels extends JFrame {

    private static final long serialVersionUID = 1L;

    public BorderPanels() {
        setLayout(new GridBagLayout());// set LayoutManager
        GridBagConstraints gbc = new GridBagConstraints();
        JPanel panel1 = new JPanel();
        Border eBorder = BorderFactory.createEtchedBorder();

        panel1.setBorder(BorderFactory.createTitledBorder(eBorder, "70pct"));
        gbc.gridx = gbc.gridy = 0;
        gbc.gridwidth = gbc.gridheight = 1;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.anchor = GridBagConstraints.NORTHWEST;
        gbc.weightx = gbc.weighty = 70;
        add(panel1, gbc); // add compoenet to the COntentPane

        JPanel panel2 = new JPanel();
        panel2.setBorder(BorderFactory.createTitledBorder(eBorder, "30pct"));
        gbc.gridy = 1;
        gbc.weightx = gbc.weighty = 30;
        gbc.insets = new Insets(2, 2, 2, 2);
        add(panel2, gbc); // add component to the COntentPane

        JPanel panel3 = new JPanel();
        panel3.setBorder(BorderFactory.createTitledBorder(eBorder, "20pct"));
        gbc.gridx =1;
        gbc.gridy = 0;
        gbc.gridwidth = /*gbc.gridheight = */1;
        gbc.gridheight = 2;
        gbc.weightx = /*gbc.weighty = */20;
        gbc.insets = new Insets(2, 2, 2, 2);
        add(panel3, gbc);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // important
        pack();
        setVisible(true); // important
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() { // important

            public void run() {
                BorderPanels borderPanels = new BorderPanels();
            }
        });
    }
}
于 2012-06-29T11:40:11.497 に答える
1

一言: MigLayout。ご覧のとおり、標準のレイアウト マネージャーで可能です。しかし、MigLayout を使用すると、レイアウト コードが 4 行に削減されることは保証できます (ただし、通常のレイアウト マネージャーとは動作が少し異なるため、MigLayout を使用するには時間がかかります)。

于 2012-06-29T13:40:44.157 に答える