2013-02-07 1 views
0

JTabbedPane의 탭간에 구성 요소를 전환 할 수 있습니까? 이러한 객체의 새 인스턴스를 만들지 않습니까? 또는 탭을 전환하는 방법은 무엇입니까?JTabbedPane의 탭 사이에서 구성 요소를 교환하십시오.

JTabbedPane에서 .remove(idx) 또는 .removeTabAt(idx) 방법을 통해 구성 요소를 제거하면 구성 요소가 파괴됩니다. 어쩌면 개체를 파괴하지 못하게하는 방법이 있을까요?

구성 요소가 포함 된 탭을 제거하여 가장 가까운 장래에 추가 할 수있는 방법을 찾고 있지만 다른 색인을 사용하고 있습니다.

즉, 탭 순서 만 변경하면됩니다. 그러나 새로운 구성 요소 인스턴스를 만들지 않는 것이 중요합니다.

+0

제거하지 않으려는 경우 구성 요소를 숨길 수 있습니다. – Arpit

답변

0

제거하지 않으려는 경우 구성 요소를 숨길 수 있습니다. 을 사용하여 탭을 전환 할 수 있습니다.

인덱스는이 더러운 해킹에 대한 구성 요소를 사용 componen.setVisible(false)

0

무엇을 숨길 setSelectedIndex(int index)

를 사용하여 설정하는 방법?

public static void main (String [] args) throws Exception 
{ 
    final JTabbedPane tabbedPane = new JTabbedPane(); 
    tabbedPane.addTab ("A", new JButton ("A")); 
    tabbedPane.addTab ("B", new JButton ("B")); 
    tabbedPane.addTab ("C", new JButton ("C")); 
    tabbedPane.addTab ("D", new JButton ("D")); 
    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().setLayout (new BorderLayout()); 
    frame.getContentPane().add (tabbedPane, BorderLayout.CENTER); 
    frame.pack(); 
    frame.setVisible (true); 

    Field pagesField = JTabbedPane.class.getDeclaredField ("pages"); 
    pagesField.setAccessible (true); 
    final List <Object> pages = (List <Object>)pagesField.get (tabbedPane); 

    while (true) 
    { 
     Thread.sleep (1000); 

     SwingUtilities.invokeLater (new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       Object o = pages.get (0); 

       for (int i = 1; i < pages.size(); i++) 
        pages.set (i - 1, pages.get (i)); 

       pages.set (pages.size() - 1, o); 

       tabbedPane.setSelectedIndex ((tabbedPane.getSelectedIndex() + pages.size() - 1) % pages.size()); 

       tabbedPane.invalidate(); 
       tabbedPane.repaint(); 
      } 
     }); 
    } 
} 
3

JTabbedPane.removeTabAt은 탭만 제거하지만 탭 안에 넣은 구성 요소는 제거하지 않습니다. 따라서 특정 구성 요소의 탭을 이동하려면 새 위치에있는 구성 요소의 새 탭을 JTabbedPane.insertTab으로 삽입하면 암시 적으로 이전 구성 요소가 제거됩니다. 또는 직접 제거하고 나중에 다시 추가 할 수 있습니다. 두 가지 방법 모두 잘 작동합니다.

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTabbedPane; 
import javax.swing.SwingUtilities; 

public class ReorderTabs { 
    private static void addTab(final JTabbedPane tabbedPane, final String title) { 
     final JPanel panel = new JPanel(new BorderLayout()); 

     JLabel content = new JLabel(title + " - content", JLabel.CENTER); 
     panel.add(content, BorderLayout.CENTER); 

     JButton toFrontButton = new JButton("|<"); 
     toFrontButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent event) { 
       // Re-insert the component in a new tab at the front. The tabbed pane will remove the old tab. 
       tabbedPane.insertTab(title, null, panel, null, 0); 
      } 
     }); 
     panel.add(toFrontButton, BorderLayout.WEST); 

     JButton toBackButton = new JButton(">|"); 
     toBackButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       // Remove the component from the tab. The component will not be destroyed ... 
       int index = tabbedPane.indexOfComponent(panel); 
       tabbedPane.removeTabAt(index); 

       // ... and can be added again (or inserted at an arbitrary index with insertTab). 
       tabbedPane.addTab(title, panel); 
      } 
     }); 
     panel.add(toBackButton, BorderLayout.EAST); 

     tabbedPane.addTab(title, panel); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       JTabbedPane tabbedPane = new JTabbedPane(); 
       addTab(tabbedPane, "Tab #1"); 
       addTab(tabbedPane, "Tab #2"); 
       addTab(tabbedPane, "Tab #3"); 
       addTab(tabbedPane, "Tab #4"); 

       JFrame frame = new JFrame("Reorder Tabs Demo"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(tabbedPane, BorderLayout.CENTER); 
       frame.setSize(400, 200); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 
+0

getComponentAt에 추가되었습니다. (OP가 원래 참조를 잃어 버린 것처럼 보입니다) 그리고 훌륭한 답을 얻었습니다;) – MadProgrammer