java - TabbedPane 迭代 for 循环

标签 java swing jpanel jscrollpane jtabbedpane

我在循环迭代中收到的信息为:

Tab 1
Tab 2

在开始代码中,我有面板、选项卡 Pane 和滚动 Pane :

JPanel panel = new JPanel();
JTabbedPane tabbedPane = new JTabbedPane();
JScrollPane scrollPanel = new JScrollPane();

然后使用Event JList通过迭代接收,接收Tab 1Tab 2,但不能添加两个选项卡。所以这里是迭代并将 Tab 1Tab 2 接收到 tab_name 变量中:

String tab_name = ap_data_array[2]; // Tab 1, Tab 2

tabbedPane.addTab(tab_name, panel); // Here add only once tab Tab 1
this.jPanel1.add(tabbedPane, BorderLayout.CENTER);

scrollPanel.setViewportView(new JLabel(ap_data_array[2]));
tabbedPane.setBounds(0, 0, 530, 500);

this.jPanel1.setSize(530,500);

System.out.println(tab_name); // Tab 1 then Tab 2

结果只会呈现 1 个选项卡,选项卡 1

完整代码如下:

String lines[] = loaded_data.split("\\r?\\n");
for (String item : lines)
{
String pattern = "AP.*";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(item);

// Added
JPanel panel = new JPanel();
JTabbedPane tabbedPane = new JTabbedPane();
JScrollPane scrollPanel = new JScrollPane();

if (m.find())
{
    String ap_data = m.group(0);
    String[] ap_data_array = ap_data.split("\\|", -1);



    if (ap_data_array[0].equals("AP"))
    {
        JList source = (JList)evt.getSource();
        String selected = source.getSelectedValue().toString();

        // type selected
        if (ap_data_array[1].equals(selected))
        {
            // tabs name
            //ap_data_array[2]  // "Tab 1" "Tab 2"

            String tab_name = ap_data_array[2];

            tabbedPane.addTab(tab_name, panel);
            this.jPanel1.add(tabbedPane, BorderLayout.CENTER);

            scrollPanel.setViewportView(new JLabel(ap_data_array[2]));
            tabbedPane.setBounds(0, 0, 530, 500);



            this.jPanel1.setSize(530,500);

            System.out.println(tab_name); // "Tab 1" "Tab 2"
     }
     }
}
}

解决方案:

    private void jList1ValueChanged(javax.swing.event.ListSelectionEvent evt) {                                    

    if (evt.getValueIsAdjusting())
    {
        JTabbedPane tabbedPane = new JTabbedPane();

        this.jPanel1.removeAll(); // REMOVE ALL DATA IN PANEL TO RELOAD NEW TAB PANEL IN LOOP

        String lines[] = loaded_data.split("\\r?\\n");
        for (String item : lines)
        {
            String pattern = "AP.*";
            Pattern r = Pattern.compile(pattern);
            Matcher m = r.matcher(item);

            JPanel panel = new JPanel();

            if (m.find())
            {
                String ap_data = m.group(0);
                String[] ap_data_array = ap_data.split("\\|", -1);



                if (ap_data_array[0].equals("AP"))
                {
                    JList source = (JList)evt.getSource();
                    String selected = source.getSelectedValue().toString();

                    // type selected
                    if (ap_data_array[1].equals(selected))
                    {
                        String tab_name = ap_data_array[2]; // STRING "Tab 1" and "Tab 2" loop


                        this.jPanel1.add(tabbedPane, BorderLayout.CENTER);
                        tabbedPane.add(tab_name, new JLabel(tab_name));

                        tabbedPane.setBounds(0, 0, 530, 500);

                        this.jPanel1.setSize(530,500);
                    }
                }
            }
        }
    }

    }            

最佳答案

如果我正确理解您的代码(不能保证,因为它不是我可以运行和测试的 minimal example program),在 for 循环内部,您将在每次迭代中创建一个新的 JTabbedPane,向其中添加一个选项卡,然后将其添加到 BorderLayout - 使用 JPanel 的 BorderLayout.CENTER 位置。因此,如果迭代两次,您将创建两个 JTabbedPanes,每个 JTabbedPanes 只有一个选项卡,第二个将完全覆盖第一个选项卡。如果这确实是问题的根源,那么解决方案很简单:仅创建一个 JTabbedPane,在 for 循环之前执行此操作,然后在for 循环。

其他问题包括您对 setBounds(...) 的使用。不要这样做。

关于java - TabbedPane 迭代 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30287050/

相关文章:

java - 来自java程序的命令

java - 如何将应用设置为默认应用或让用户选择应用?

java - Eclipse Helios 给出错误 Java 已启动但返回退出代码 -805306369

java - 如何确定正在查看 JScrollpane 中的哪个 JPanel?

java - 如何通过在java中的空位置添加零来使两个不相等的二维数组相等?

java - 单独且不连续的 JTable 单元格选择

java - 在其他 JPanel 内重新绘制 JPanel

java - 将 JButton 数组添加到 JPanel(按钮不可见)

java - 将面板和文本框放在同一个框架中

Java JPanel 不会出现在 Linux 中的 JFrame 中