JPanel不允许定位组件

时间:2015-07-08 07:18:35

标签: java swing jframe jpanel jtabbedpane

所以我创建了2 JFrames

Person

Work Detail

但后来我意识到2 JFrames不是一个好主意。所以我添加了JTabbedPane,然后尝试以'JPanel的形式添加不同的标签。但我不能像Jframe那样对组件进行定位,看起来像这样。

Main Menu

但我希望它像这样

Expected Main Menu

我该怎么做?

2 个答案:

答案 0 :(得分:7)

如果没有工作示例,您似乎已经离开JPanel的默认布局(FlowLayout)。

首先为每个视图创建一个自定义面板,这样可以更轻松地管理并将其应用到JTabbedPane

对于您的即时布局问题,我建议GridBagLayout的功能和灵活性......

Layout Layout

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                JTabbedPane tp = new JTabbedPane();
                tp.add("Person", new JPanel());
                tp.add("Work Detail", new TestPane());

                frame.add(tp);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JTextField name;
        private JTextField serial;
        private JTextField id;
        private JTextField email;

        private JComboBox level;

        public TestPane() {
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.anchor = GridBagConstraints.EAST;
            gbc.insets = new Insets(2, 2, 2, 2);

            add(new JLabel("Name"), gbc);
            gbc.gridx += 2;
            add(new JLabel("Sr No"), gbc);
            gbc.gridx = 0;
            gbc.gridy++;
            add(new JLabel("ID"), gbc);
            gbc.gridx += 2;
            add(new JLabel("Email ID"), gbc);

            name = new JTextField(10);
            serial = new JTextField(10);
            id = new JTextField(10);
            email = new JTextField(10);

            level = new JComboBox(new String[]{"Manager", "Eng Lead", "Eng Designer", "Jr Designer"});

            gbc.anchor = GridBagConstraints.WEST;
            gbc.gridx = 1;
            gbc.gridy = 0;
            add(name, gbc);
            gbc.gridx += 2;
            add(serial, gbc);
            gbc.gridx = 1;
            gbc.gridy++;
            add(id, gbc);
            gbc.gridx += 2;
            add(email, gbc);

            gbc.gridx = 0;
            gbc.gridy++;
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            add(level, gbc);

            gbc.gridy++;
            gbc.anchor = GridBagConstraints.CENTER;
            add(new JButton("Save"), gbc);
        }

    }

}

答案 1 :(得分:2)

这是我最近使用过的。只需使用您想要的布局(我在这里选择MigLayout)。

JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);

JPanel pnlOne = new JPanel();
tabbedPane.addTab("Tab One Name", null, pnlOne, null);
pnlOne.setLayout(new MigLayout("", "[644.00,grow][50px:n,grow][]","[grow][]"));

JPanel pnlTwo = new JPanel();
tabbedPane.addTab("Tab Two Name", null, pnlTwo, null);
pnlTwo.setLayout(new MigLayout("", "[grow][]", "[grow][]"));