Java 选项卡窗格循环迭代
我收到的循环迭代是:Java 选项卡窗格循环迭代,java,swing,jpanel,jscrollpane,jtabbedpane,Java,Swing,Jpanel,Jscrollpane,Jtabbedpane,我收到的循环迭代是: Tab 1 Tab 2 在开始代码中,我有面板、选项卡窗格和滚动窗格: JPanel panel = new JPanel(); JTabbedPane tabbedPane = new JTabbedPane(); JScrollPane scrollPanel = new JScrollPane(); 然后使用Event JList通过迭代接收,并接收选项卡1和选项卡2,但不能添加两个选项卡。因此,这里是迭代并接收Tab 1和Tab 2到Tab_name变量: St
Tab 1
Tab 2
在开始代码中,我有面板、选项卡窗格和滚动窗格:
JPanel panel = new JPanel();
JTabbedPane tabbedPane = new JTabbedPane();
JScrollPane scrollPanel = new JScrollPane();
然后使用Event JList通过迭代接收,并接收选项卡1
和选项卡2
,但不能添加两个选项卡。因此,这里是迭代并接收Tab 1
和Tab 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);
}
}
}
}
}
}
如果我正确理解了您的代码(因为它不是一个我可以运行和测试的工具,所以不能保证),在for循环内部,您将在每次迭代中创建一个新的JTabbedPane,向其添加一个选项卡,然后在BorderLayout.CENTER位置使用JPanel将其添加到BorderLayout。因此,如果迭代两次,将创建两个JTabbedPane,每个都只有一个选项卡,第二个选项卡将完全覆盖第一个选项卡。如果这确实是问题的根源,那么解决方法很简单:只创建一个JTabbedPane,在for循环之前执行此操作,并在for循环中添加选项卡(jpanel)
其他问题包括使用
setBounds(…)
。不要这样做。如果您在数组中只接收两个项目,为什么要索引到ap\u data\u数组[2]
?有上面的迭代,ap\u data\u数组[2]
只接收字符串选项卡1
。那么您想要的预期输出是什么呢?我在第一个循环中接收到选项卡1
,然后只渲染一个选项卡,然后在下一次迭代中,Tab 2
作为字符串出现,应该使用addTab()
函数添加Tab,但它不会只呈现一个Tab。为了更好地提供帮助,请尽快发布SSCCE/MCVE,简短,可运行,可编译我认为这是可能的答案,我会检查它。找到解决方案。应该是:this.jPanel1.add(选项卡窗格,BorderLayout.CENTER);tabbedPane.add(tab_名称,新JLabel(tab_名称))代码>而不是addTab()
函数。