Java 自动创建组件到';选定的';JTabbedPane

Java 自动创建组件到';选定的';JTabbedPane,java,swing,user-interface,awt,jtabbedpane,Java,Swing,User Interface,Awt,Jtabbedpane,我已经写了一个代码,如下所示。 在这里,我有一个选项卡式面板,我在其中添加了更多带有“+”(添加制表符)的选项卡,如框架右侧的gChrome。我在框架的左侧有另一个固定面板,由一些按钮组成。 我的问题是: 1。现在,我想使用另一个面板上的按钮操作,将一些组件添加到特定的选项卡式面板(面板1或面板2..)中。我怎样才能做到这一点。之后,我需要将每个选项卡式面板的所有组件列表保存在脚本中。 有什么建议吗 2。如果运行代码,您可以在输出中看到右侧选项卡式面板的尺寸非常窄,可能是用于使用BorderLa

我已经写了一个代码,如下所示。 在这里,我有一个选项卡式面板,我在其中添加了更多带有“+”(添加制表符)的选项卡,如框架右侧的gChrome。我在框架的左侧有另一个固定面板,由一些按钮组成。 我的问题是:

1。现在,我想使用另一个面板上的按钮操作,将一些组件添加到特定的选项卡式面板(面板1或面板2..)中。我怎样才能做到这一点。之后,我需要将每个选项卡式面板的所有组件列表保存在脚本中。 有什么建议吗

2。如果运行代码,您可以在输出中看到右侧选项卡式面板的尺寸非常窄,可能是用于使用BorderLayout.LINE\u END。如果扩展GUI,面板的大小将保持不变。 我想固定标签面板的窄尺寸,我想标签面板的尺寸也会随着框架的增加而增加

谢谢

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

public class TestTabSelection extends JFrame {

    public JTabbedPane tab = new JTabbedPane();
    public JPanel editPanel = new JPanel();
    private JButton MM, CM, AAA, VO;

    public TestTabSelection() {


        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JPanel panel1 = new JPanel();
                panel1.setSize(600, 550);
                JPanel createAll = new JPanel();
                createAll.setLayout(new BorderLayout());
                createAll.BorderLayout.LINE_END;

                tab.addTab("CreateAll", createAll);
                tab.addTab("Slice 1", panel1);
                tab.addTab("+", new JPanel());
                tab.getModel().addChangeListener(new ChangeListener() {
                    private int lastSelected;
                    private boolean ignore = false;

                    @Override
                    public void stateChanged(ChangeEvent e) {
                        if (!ignore) {
                            ignore = true;
                            try {
                                int selected = tab.getSelectedIndex();
                                String title = tab.getTitleAt(selected);
                                if ("+".equals(title)) {
                                    JPanel pane = CreateSlice();
                                    tab.insertTab("Slice "
                                            + (tab.getTabCount()), null, pane,
                                            null, lastSelected + selected);
                                    tab.setSelectedComponent(pane);
                                } else {
                                    lastSelected = selected;
                                }
                            } finally {
                                ignore = false;
                            }
                        }
                    }
                });



                final JButton btn = new JButton("Add");
                btn.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        System.out.println(tab.getTabCount());
                    }
                });

                JFrame frame = new JFrame("Testing");
                frame.setTitle("Network Slice Creation");
                frame.setSize(1000, 700);
                frame.setBackground(Color.gray);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                createPanel0();
                frame.add(editPanel, BorderLayout.LINE_START);
                frame.add(tab,BorderLayout.LINE_END);

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

    private void createPanel0() {

        editPanel = new JPanel(null);
        editPanel.setPreferredSize(new Dimension(330, 650));
        editPanel.setBorder(BorderFactory.createLineBorder(Color.gray));
        editPanel.setBorder(BorderFactory
                .createTitledBorder("Netowrk Functions"));
        // editPanel.setLayout(new BorderLayout());

        // FunctionHandler handler = new FunctionHandler();

        MM = new JButton("MM");
        MM.setBounds(50, 80, 150, 40);
        MM.setVisible(true);
        // MM.addActionListener(handler);

        AAA = new JButton("AAA");
        AAA.setBounds(50, 160, 150, 40);
        AAA.setVisible(true);
        // AAA.addActionListener(handler);

        CM = new JButton("CM");
        CM.setBounds(50, 240, 150, 40);
        CM.setVisible(true);
//      CM.addActionListener(handler);

        VO = new JButton("VO");
        VO.setBounds(50, 320, 150, 40);
        VO.setVisible(true);
        /* VO.addActionListener(handler); */

        editPanel.add(MM);
        editPanel.add(AAA);
        editPanel.add(CM);
        editPanel.add(VO);

    }

    public JPanel CreateSlice() {

        JPanel pane = new JPanel(null);
        pane.setPreferredSize(new Dimension(550, 600));
        return pane;

    }

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

}

我找到了解决办法, 需要一个全局变量,
int index
, 在stateChanged方法中,
index=e.getSource().getselectedIndex()
我将每个面板保存在ArrayList(PanelList)中,
然后,将显示任何按钮为所选JTabbedPane创建组件所执行的操作

PanelList.get(index).add(button);

它获取我选择的JTabbedPane并在其中添加组件。

您的第二个假设是正确的,您需要使用不同的布局管理器,如果我扩展框架,使右侧面板也随框架一起扩展,布局更好@MadProgrammer@MadProgrammer,你能告诉我第一点的情况吗?我希望了解你的想法。我可以将ChangeListener用于选项卡,但我需要排除“+”选项卡选择,我尝试过,但没有成功。更好的布局正是满足您需要的布局,也许可以尝试使用
GridBagLayout
谢谢@MadProgrammer,它可以工作。