我有点困惑,因为我无法删除JTabbedPane的最后一个Tab。 我读了这两个问题: first question 和second question。但它对我没有帮助。 这就是我的代码的样子:
public void updateTabbedPane()
{
// Remove the MouseListener
tabbedPane.removeMouseListener(tabbedPaneMouseListener);
// Remove all Tabs
while (tabbedPane.getTabCount() > 0)
{
tabbedPane.remove(0);
}
// Sort the ArrayList
Collections.sort(arrayList);
// Add all Element to the JTabbedPane
for (int i = 0; i < arrayList.size(); i++)
{
tabbedPane.addTab(arrayList.get(i).getName(),
new JScrollPane(...);
}
// Add the MouseListiner to the JTabbedPane again
tabbedPane.addMouseListener(tabbedPaneMouseListener);
}
如果在列表中添加/删除对象,我将使用此方法添加/删除选项卡。我也对ArrayList进行排序,因为我希望按升序排列选项卡。
正如在两个问题的答案中所说,我在删除Tabs之前删除了MouseListener,但最后一个Tab仍然可见。我也试过setVisible(),removeAll()。
欢迎任何帮助!
答案 0 :(得分:2)
好像你可能没有在Swing's GUI thread中运行此代码。是在传递给Runnable
的{{1}}内吗?如果是这种情况,SwingUtilities.invokeLater(...)
应该有用。
此外,您不应直接在组件上使用removeAll
- 您应该在setVisible
上使用setSelectedIndex
或setSelectedComponent
。
此外,当标签的总顺序没有变化时,删除所有选项卡并为除了其中一个之外的所有标签再次创建新的JTabbedPane
似乎非常低效。也许您应该按排序顺序维护一个列表,例如JScrollPane
,只需在有更新时插入并删除相应索引处的单个选项卡。
答案 1 :(得分:2)
感谢Andrew Thompson和Andrew Mao的建议。
@Mao:1。)我正在使用Swing GUI Thread。 2.)setVisible
只是我解决问题的最后一个想法:-P 3.)当然这样会更高效,但在这种情况下我有点脏,因为不会同时超过三个标签。但我想我以后会改变它。
@Thompson:由于SSCCE,我创建了一个仅针对我的问题的项目(您可以在下面看到),以显示我的问题。但是这个项目有效,所以我将测试项目的小步骤与我的真实项目进行了比较,发现了一点错误。
我的问题是我在删除ArrayList
的对象之前更新了标签,因此GUI仍然将删除的对象显示为标签。
对于对我的JTabbedPane
测试项目感兴趣的任何人:
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
public class TabbedTest extends JFrame {
private JTabbedPane tabbedPane = null;
private MouseListener tabbedPaneMouseListener = null;
private ArrayList<String> nameOfTab = new ArrayList<String>();
private static int counter = 1;
public TabbedTest() {
setSize(500, 500);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setLayout(new GridLayout(0, 1));
JPanel buttonPanel = new JPanel();
JButton addButton = new JButton("add");
addButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
addElementToArrayList();
}
});
JButton removeButton = new JButton("remove");
removeButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
removeElementFromArrayList();
}
});
tabbedPane = new JTabbedPane();
tabbedPaneMouseListener = (new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e)) {
if (e.getClickCount() == 1) {
System.out.println("Do Something");
}
}
}
});
tabbedPane.addMouseListener(tabbedPaneMouseListener);
buttonPanel.add(addButton);
buttonPanel.add(removeButton);
add(buttonPanel);
this.add(tabbedPane);
}
private void addElementToArrayList() {
nameOfTab.add("" + counter++ + ". element");
updateTabbedPane();
}
private void removeElementFromArrayList() {
if (nameOfTab.size() > 0) {
nameOfTab.remove(0);
}
updateTabbedPane();
}
public void updateTabbedPane() {
tabbedPane.removeMouseListener(tabbedPaneMouseListener);
while (tabbedPane.getTabCount() > 0) {
tabbedPane.remove(0);
}
for (int i = 0; i < nameOfTab.size(); i++) {
tabbedPane.addTab(nameOfTab.get(i), new JLabel(nameOfTab.get(i)));
}
tabbedPane.addMouseListener(tabbedPaneMouseListener);
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new TabbedTest().setVisible(true);
}
});
}
}