[英]Remove last tab of jtabbedpane
我有點困惑,因為我無法刪除JTabbedPane的最后一個Tab。 我讀了這兩個問題: 第一個問題和第二個問題 。 但它對我沒有幫助。 這是我的代碼的樣子:
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()。
歡迎任何幫助!
看起來您可能沒有在Swing的GUI線程中運行此代碼。 它是否在傳遞給SwingUtilities.invokeLater(...)
的Runnable
中? 如果是這種情況, removeAll
應該可以工作。
此外,您不應該直接在組件上使用setVisible
- 您應該在JTabbedPane
上使用setSelectedIndex
或setSelectedComponent
。
此外,當選項卡的總順序沒有改變時,刪除所有選項卡並為除了其中一個之外的所有選項再次創建新的JScrollPane
似乎非常低效。 也許您應該按排序順序維護一個列表,例如TreeSet
,只需在有更新時插入並刪除適當索引處的單個選項卡。
感謝您在Andrew Thompson和Andrew Mao的建議。
@Mao:1。)我正在使用Swing GUI Thread。 2.) setVisible
只是我修復問題的最后一個想法:-P 3.)當然這樣會更高效,但在這種情況下我有點臟,因為不會有超過三個選項卡同時。 但我想我以后會改變它。
@Thompson:由於SSCCE,我為我的問題創建了一個項目(你可以在下面看到),以顯示我的問題。 但是這個項目有效,所以我將我的測試項目的小步驟與我的真實項目進行了比較,發現了一個小錯誤。
我的問題是我在刪除ArrayList
的對象之前更新了選項卡,因此GUI仍然將刪除的Object顯示為選項卡。
對於對我的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);
}
});
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.