2013-01-05 2 views
1

JTabbedPane의 마지막 탭을 제거 할 수 없기 때문에 다소 혼란 스럽습니다. 나는이 질문을 읽었다 : first questionsecond question. 그러나 그것은 나에게 도움이되지 못했습니다. 이 내 코드 같은 모습입니다 : 내가 추가하려면이 방법을 사용하고jtabbedpane의 마지막 탭을 제거하십시오.

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를 정렬합니다.

두 질문의 대답에서 말했듯이, Tab을 제거하기 전에 MouseListener를 제거했지만 마지막 Tab은 끝까지 볼 수 있습니다. 나는 또한 setVisible(), removeAll()을 시도했다.

도움이되었습니다.

+1

는이 [SSCCE] (http://sscce.org/)을 게시 할 수 있습니다. –

+0

좋아, 내가 시도합니다. – Steckdoserich

+0

인용 된 질문은 동일합니다. – trashgod

답변

2

Andrew Thompson 및 Andrew Mao의 조언에 감사드립니다.

@Mao : 1. 스윙 GUI 스레드를 사용하고 있습니다. 2.) setVisible는 나의 문제를 고치는 나의 마지막 생각이었습니다 :-P 3) 물론이 방법으로 그것은 더 좋은 결과를 낼 수 있습니다. 그러나이 경우에 나는 더 이상 3이 없을 것이기 때문에 약간 더러 웠습니다. 동시에 탭. 그러나 나는 나중에 그것을 바꿀 것이라고 생각한다.

@ 톰슨 : 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); 
      } 
     }); 
    } 
} 
+1

+1에 [sscce] (http://sscce.org/)를 사용하여 문제에 집중하십시오. 안전을 위해'@ Override' 주석을 사용하십시오. 답변에 언급 된 사람에게는 알림이 전송되지 않습니다. – trashgod

2

Swing's GUI thread에서이 코드를 실행하지 않는 것처럼 보입니다. Runnable 안에 있으며 SwingUtilities.invokeLater(...)으로 전달 되었습니까? 이 경우에 removeAll이 작동해야합니다.

또한 직접 구성 요소에 setVisible를 사용해서는 안 - 당신이해야 JTabbedPanesetSelectedIndex 또는 setSelectedComponent를 사용합니다.

또한 모든 탭을 제거하고 그 중 하나를 제외하고 모든 새로운 탭을 새로 만들면 탭의 전체 순서가 변경되지 않으면 크게 비효율적으로 보입니다. 아마도 TreeSet과 같이 정렬 된 순서로 목록을 유지해야하며 업데이트가있을 때 해당 색인에 단일 탭을 삽입 및 제거하면됩니다.