【问题标题】:Create Components automatically to the 'Selected' JTabbedPane自动创建组件到“选定的”JTabbedPane
【发布时间】:2016-03-01 14:59:53
【问题描述】:

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

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

2. 如果您运行代码,您可以在输出中看到右侧选项卡式面板的尺寸非常窄,可能是因为使用了 BorderLayout.LINE_END。如果我扩展我的 GUI,面板保持相同的大小。 我想固定标签面板的窄尺寸,我希望标签面板的尺寸也会随着 Frame 的增加而增加。

谢谢。

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();
    }

}

LayOut needs to be corrected (Image)

Target Action (Image)

【问题讨论】:

  • 你的第二个假设是正确的,你需要使用不同的布局管理器
  • 如果我扩展我的框架以便右侧面板也将与框架一起扩展,哪种布局更好?@MadProgrammer
  • @MadProgrammer,你能告诉我关于第一点的任何想法吗?我希望能得到你的想法。我可以将 ChangeListener 用于选项卡,但我需要排除“+”选项卡选择,我尝试过但无法成功。
  • 最好的布局是满足您需求的布局,也许可以尝试使用GridBagLayout
  • 感谢@MadProgrammer,它有效。

标签: java swing user-interface awt jtabbedpane


【解决方案1】:

我已经找到了解决方案, 需要一个全局变量,int index, 在 stateChanged 方法中,index = e.getSource().getselectedIndex(); 我将每个面板保存在一个 ArrayList (PanelList) 中, 然后 actionPerformed 由任何按钮创建组件到选定的 JTabbedPane,将是

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多