2

次のBorder凡例が適用されるスクリーンショットを添付しました。

黄色=JPanelありBorderLayout

青=JPanelGridBagLayout

フクシア= JPanelwithFlowLayout

言及する必要のある色でブロックされていない2つのパネルがあります。

1)「プライマリ」という単語が表示されているタイトルパネル。このパネルはBorderLayout.NORTH「黄色」パネルにあります。

2)デバイスの画像が配置されている画像パネル。このパネルは「フクシア」の兄弟です

ネストされたレイアウトの問題

「Blue」はBorderLayout.CENTER「Yellow」にあり、「Fuchsia」と画像パネルには次の制約があります。

GridBagConstraints c = new GridBagConstraints();

c.weightx = 1.0;
c.weighty = 1.0;
c.gridx = 0;
c.gridy = 0;
c.anchor = GridBagConstraints.NORTHWEST;
c.insets = new Insets(0, 10, 0, 0);
c.fill = GridBagConstraints.BOTH;

//"Blue".add(imagePanel, c);

c.weighty = 0.80;       
c.gridy = 1;
c.fill = GridBagConstraints.HORIZONTAL;


//"Blue".add("Fuchsia", c);

画像からもわかるように、「フクシア」の真下にある「ブルー」の「無駄な」スペースを取り除こうとしています。でできないようですがGridBagConstraints、間違って使っているだけLayoutManagerですか?私には「ブルー」のように見えます。彼は、上向きに収縮するのではなく、各子供に利用可能なスペースの半分を与え、残りのスペースを予約してCENTERいるだけです。ここで何が欠けていますか?これは単に「フクシア」に優先サイズまたは最大サイズを設定することの問題ですか?「フクシア」(私の色分けで覆われている)の周りの境界線は、コンポーネントの終わりを配置したい場所であるため、それでは私が望む場所に到達できないようです。BorderLayoutJPanel

4

2 に答える 2

4

GridBagLayoutを使用せずに

ここに画像の説明を入力してください

import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.border.LineBorder;

public class NestedLayout {

    private JFrame frame = new JFrame();
    private JPanel yellowNorthPanel = new JPanel();
    private JPanel yellowPanel = new JPanel();
    private JPanel bluePanel = new JPanel();
    private JPanel fuchsiaTopPanel = new JPanel();
    private JPanel fuchsiaBottonPanel = new JPanel();

    public NestedLayout() {
        yellowNorthPanel.setBorder(new LineBorder(Color.yellow, 5));
        yellowPanel.setLayout(new BorderLayout());
        yellowPanel.setBorder(new LineBorder(Color.yellow, 5));
        bluePanel.setLayout(new BorderLayout(5, 5));
        bluePanel.setBorder(new LineBorder(Color.blue, 5));
        fuchsiaTopPanel.setBorder(new LineBorder(Color.cyan, 5));
        fuchsiaBottonPanel.setBorder(new LineBorder(Color.cyan, 5));
        bluePanel.add(fuchsiaTopPanel, BorderLayout.NORTH);
        bluePanel.add(fuchsiaBottonPanel);
        yellowPanel.add(bluePanel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(yellowNorthPanel, BorderLayout.NORTH);
        frame.add(yellowPanel);
        //frame.pack();
        frame.setSize(400, 300);
        frame.setVisible(true);
    }

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

            @Override
            public void run() {
                new NestedLayout();
            }
        });
    }
}
于 2012-06-07T16:00:25.727 に答える
4

レイアウトスナップショット

このコード例から、この出力を見てください:

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

public class LayoutTest
{
    private void displayGUI()
    {
        JFrame frame = new JFrame("Layout Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel contentPane = new JPanel();
        contentPane.setOpaque(true);
        contentPane.setBackground(Color.YELLOW);
        contentPane.setLayout(new BorderLayout(2, 2));

        JPanel topPanel = new JPanel();
        topPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
        JLabel headingLabel = new JLabel("Primary");
        topPanel.add(headingLabel);
        contentPane.add(topPanel, BorderLayout.PAGE_START);

        JPanel centerPanel = new JPanel();
        centerPanel.setOpaque(true);
        centerPanel.setBackground(Color.BLUE);
        centerPanel.setLayout(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.FIRST_LINE_START;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.weightx = 1.0;
        gbc.weighty = 0.2;
        gbc.gridx = 0;
        gbc.gridy = 0;

        JPanel imagePanel = new JPanel();   
        JLabel imageLabel = null;
        try
        {
            imageLabel = new JLabel(
                            new ImageIcon(
                                new java.net.URL(
                                    "http://pscode.org/"
                                    + "tame/screenshot/"
                                    + "landscape/slider1.gif")));
        }
        catch(Exception e)  
        {
            e.printStackTrace();
        }
        imagePanel.add(imageLabel);
        centerPanel.add(imagePanel, gbc);

        JPanel detailsPanel = new JPanel();
        detailsPanel.setOpaque(true);
        detailsPanel.setBackground(Color.WHITE);
        detailsPanel.setBorder(
                        BorderFactory.createEmptyBorder(
                                              5, 5, 5, 5));
        detailsPanel.setLayout(new GridLayout(0, 1, 5, 5));

        JLabel statusLabel = new JLabel("Chassis Status : ");
        JLabel usageLabel = new JLabel("Bandwidth Usage : ");
        JLabel fanLabel = new JLabel("Fan Status : ");

        detailsPanel.add(statusLabel);
        detailsPanel.add(usageLabel);
        detailsPanel.add(fanLabel);

        gbc.fill = GridBagConstraints.BOTH;
        gbc.weighty = 0.8;
        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.gridheight = 3;
        centerPanel.add(detailsPanel, gbc);

        contentPane.add(centerPanel, BorderLayout.CENTER);

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new LayoutTest().displayGUI();
            }
        });
    }
}
于 2012-06-07T16:19:08.230 に答える