TabbedPane 迭代循环
TabbedPane iterate for loop
我在循环迭代中收到:
Tab 1
Tab 2
在开始的代码中,我有面板、选项卡窗格和滚动窗格:
JPanel panel = new JPanel();
JTabbedPane tabbedPane = new JTabbedPane();
JScrollPane scrollPanel = new JScrollPane();
然后使用Event JList通过迭代接收,接收到Tab 1
和Tab 2
,但是不能添加两个tab。所以这里是迭代并将 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 个选项卡,Tab 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 循环内你创建了一个 new JTabbedPane 每次迭代,向其添加一个选项卡,然后将其添加到 BorderLayout.CENTER 位置的 BorderLayout-using JPanel。因此,如果您迭代两次,您将创建两个 JTabbedPanes,每个只有一个选项卡,第二个将完全覆盖第一个。如果这确实是您问题的根源,那么解决方案很简单:仅创建 one JTabbedPane,在 before for 循环中执行此操作,然后添加您的for 循环内的选项卡 (JPanels)。
其他问题包括您对 setBounds(...)
的使用。不要这样做。
我在循环迭代中收到:
Tab 1
Tab 2
在开始的代码中,我有面板、选项卡窗格和滚动窗格:
JPanel panel = new JPanel();
JTabbedPane tabbedPane = new JTabbedPane();
JScrollPane scrollPanel = new JScrollPane();
然后使用Event JList通过迭代接收,接收到Tab 1
和Tab 2
,但是不能添加两个tab。所以这里是迭代并将 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 个选项卡,Tab 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 循环内你创建了一个 new JTabbedPane 每次迭代,向其添加一个选项卡,然后将其添加到 BorderLayout.CENTER 位置的 BorderLayout-using JPanel。因此,如果您迭代两次,您将创建两个 JTabbedPanes,每个只有一个选项卡,第二个将完全覆盖第一个。如果这确实是您问题的根源,那么解决方案很简单:仅创建 one JTabbedPane,在 before for 循环中执行此操作,然后添加您的for 循环内的选项卡 (JPanels)。
其他问题包括您对 setBounds(...)
的使用。不要这样做。