如何正确设置jpanels的大小?

时间:2016-11-01 01:53:00

标签: java swing jpanel layout-manager

我有两个jpanel:jpanel1和jpanel2,根据其内容必须具有正确的最小尺寸。 jpanel0是这两个面板的容器,它必须位于框架的左侧。这里是jpanel3,应该占用右侧的剩余可用空间。

如何将jpanel的大小设置为所有可用空间?

我想要的输出: enter image description here

我目前的输出: enter image description here

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;

public class Panels {

public static void main(String[] args) {

    JFrame myFrame = new JFrame();
    myFrame.setLayout(new BorderLayout());

    JTabbedPane jtp = new JTabbedPane();

    JPanel jPaneTab1 = new JPanel();
    jPaneTab1.setLayout(new FlowLayout(FlowLayout.LEFT));

    JPanel jpanel0 = new JPanel();
    jpanel0.setLayout(new BoxLayout(jpanel0, BoxLayout.Y_AXIS));
    jpanel0.setBorder(BorderFactory.createTitledBorder("jpanel0"));
    jpanel0.setBackground(Color.RED);


    JPanel jpanel1 = new JPanel();
    jpanel1.setLayout(new GridBagLayout());
    jpanel1.setBorder(BorderFactory.createTitledBorder("jpanel1"));
    GridBagConstraints gc = new GridBagConstraints();
    jpanel1.setBackground(Color.BLUE);

    JLabel jlabel1 = new JLabel("jlabel1");
    gc.gridx = 0;
    gc.gridy = 0;
    gc.anchor = GridBagConstraints.NORTHWEST;
    gc.insets = new Insets(0, 0, 0, 2);
    jpanel1.add(jlabel1, gc);
    JLabel jlabel2 = new JLabel("jlabel2");
    gc.gridx = 0;
    gc.gridy = 1;
    gc.anchor = GridBagConstraints.NORTHWEST;
    gc.insets = new Insets(0, 0, 0, 2);
    jpanel1.add(jlabel2, gc);


    JPanel jpanel2 = new JPanel();
    jpanel2.setLayout(new GridBagLayout());
    jpanel2.setBorder(BorderFactory.createTitledBorder("jpanel2"));
    GridBagConstraints gc2 = new GridBagConstraints();
    jpanel1.setBackground(Color.BLUE);

    JLabel jlabel3 = new JLabel("jlabel3");
    gc2.gridx = 0;
    gc2.gridy = 0;
    gc2.anchor = GridBagConstraints.NORTHWEST;
    gc2.insets = new Insets(0, 0, 0, 2);
    jpanel2.add(jlabel3, gc2);
    JLabel jlabel4 = new JLabel("jlabel4");
    gc2.gridx = 0;
    gc2.gridy = 1;
    gc2.anchor = GridBagConstraints.NORTHWEST;
    gc2.insets = new Insets(0, 0, 0, 2);
    jpanel2.add(jlabel4, gc2);






    JPanel jpanel3 = new JPanel();
    jpanel3.setBackground(Color.YELLOW);
    JLabel jlabel5 = new JLabel("jpanel3");
    jpanel3.add(jlabel5);

    jpanel0.add(jpanel1);
    jpanel0.add(jpanel2);
    jPaneTab1.add(jpanel0, BorderLayout.WEST);
    jPaneTab1.add(jpanel3, BorderLayout.CENTER);        

    JPanel jPaneTab2 = new JPanel();


    jtp.addTab("tab1", jPaneTab1);
    jtp.addTab("tab2", jPaneTab2);

    myFrame.add(jtp);       
    myFrame.setSize(800, 600);
    myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    myFrame.setVisible(true);
}

}

增加:

当我使用BorderLayout作为main(标签面板)时,我遇到了另一个问题: enter image description here

2 个答案:

答案 0 :(得分:2)

当您将布局分解为逻辑面板,然后使用不同的布局管理器嵌套面板时,布局会更轻松。

例如,使用带有BorderLayout的面板作为选项卡式窗格的内容。

然后创建一个“骑行侧面板”并将其添加到此面板和“中心面板”

JPanel main = new JPanel( new BorderLayout() );
JPanel rightSide = new JPanel( ... );
JPanel center = new JPanel(...);
main.add(rightSide, BorderLayout.LINE_START);
main.add(center, BorderLayout.CENTER);

然后设置“rightSide”和“center”面板的布局,并为每个面板添加组件。

答案 1 :(得分:2)

您不应该使用GridBagLayoutBorderLayoutBoxLayout经理。这些都是90年代过时的经理人。

例如,当你这样做时:

gc.insets = new Insets(0, 0, 0, 2);

你正在硬编码组件之间的像素宽度空间 将无法在今天各种各样的屏幕上发挥作用。

Insted,应该选择GroupLayoutMigLayout

以下是MigLayout经理的工作示例。注意多么容易 是使用此管理器创建布局。 (四行代码。)另外,我们使用逻辑像素(lp)而不是物理像素。

package com.zetcode;

import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import net.miginfocom.swing.MigLayout;

public class PanelsEx extends JFrame {

    public PanelsEx() {

        initUI();
    }

    private void initUI() {

        JTabbedPane tabpane = new JTabbedPane();

        JPanel mainPanel = new JPanel();

        JPanel pnl1 = createPanel("Panel 1");
        JPanel pnl2 = createPanel("Panel 2");
        JPanel pnl3 = createPanel("Panel 3");        

        mainPanel.setLayout(new MigLayout("ins 10lp"));

        mainPanel.add(pnl1, "w 150lp, h 100lp, split 2, flowy, ay top");
        mainPanel.add(pnl2, "w 150lp, h 100lp");
        mainPanel.add(pnl3, "push, grow");

        tabpane.add("First", mainPanel);

        add(tabpane);

        pack();        

        setTitle("Panels");
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

    }

    private JPanel createPanel(String text) {

        JLabel lbl = new JLabel(text);
        JPanel pnl = new JPanel();
        pnl.add(lbl);

        pnl.setBorder(BorderFactory.createEtchedBorder());

        return pnl;
    }

    public static void main(String[] args) {

        EventQueue.invokeLater(() -> {
            PanelsEx ex = new PanelsEx();
            ex.setVisible(true);
        });
    }
}

这是截图:

Screenshot of the code example