2013-11-26 3 views
0

안녕하세요, Google 크롬과 같은 탭 패널을 만들어야합니다. 다른 탭을 누르면 크롬이 탭을 넣습니다. 나는 이것을 가지고있다. 나는 기호 "+"로 탭을 누르면 first screenjtabbedPane의 탭을 Google 크롬처럼 추가하십시오.

하지만, 이것은 효과 : second screen

내가 새 탭의 위치를 ​​기호 "+"로 위치를 교환 생각,하지만 난 할 수 그럴 수 없어. 나는 문제가있다. 정말로 나는 그 효과가있는 네비게이터 크롬처럼하고 싶다. 감사.

public class Main { 

public static void main(String[] args) { 

    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
    VentanaPrincipalFrame ventana = new  VentanaPrincipalFrame(); 
       ventana.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

} 

주요 프레임 : 여기에 내가 코드를

public class VentanaPrincipalFrame extends JFrame { 

private JTabbedPane tabbedPane; 

private JPanel panelAdd; 


public VentanaPrincipalFrame() { 

    initFrame(); 

    panelAdd = new JPanel(); 
    tabbedPane = new JTabbedPane(JTabbedPane.TOP); 

    tabbedPane.addChangeListener(new ChangeListener() { 

     int i = 1; 

     @Override 
     public void stateChanged(ChangeEvent e) { 

      JTabbedPane tab = (JTabbedPane) e.getSource(); 

      if(tab.getSelectedIndex() == tabbedPane.getTabCount()-1 && tabbedPane.getTabCount() > 1){ 
       i++; 
       addPestana("Tab"+i); 
       //mensaje("Hola soy el ultimo"); 
      } 

     } 
    }); 


    getContentPane().add(tabbedPane, BorderLayout.CENTER); 
    tabbedPane.addTab("New tab", new PanelDinamicoPanel()); 
    tabbedPane.addTab("+", panelAdd); 

} 

public void addPestana(String titulo){ 

    tabbedPane.addTab(titulo , new PanelDinamicoPanel()); 

} 



private void initFrame() { 

    setTitle("Principal"); 
    setSize(400,400); 
    setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
    setLocationRelativeTo(null); 

} 



} 

내 사용자 지정 탭 : 모두에게

public class PanelDinamicoPanel extends JPanel{ 

private JTextField textField; 


public PanelDinamicoPanel() { 

    setLayout(new BorderLayout(0, 0)); 

    JPanel botonesPanel = new JPanel(); 
    FlowLayout flowLayout_1 = (FlowLayout) botonesPanel.getLayout(); 
    flowLayout_1.setAlignment(FlowLayout.RIGHT); 
    add(botonesPanel, BorderLayout.SOUTH); 

    JPanel panel = new JPanel(); 
    FlowLayout flowLayout = (FlowLayout) panel.getLayout(); 
    flowLayout.setAlignment(FlowLayout.RIGHT); 
    botonesPanel.add(panel); 

    JButton btnNewButton = new JButton("New button"); 
    panel.add(btnNewButton); 

    JButton btnNewButton_1 = new JButton("New button"); 
    panel.add(btnNewButton_1); 

    JPanel panel_1 = new JPanel(); 
    add(panel_1, BorderLayout.CENTER); 
    GridBagLayout gbl_panel_1 = new GridBagLayout(); 
    gbl_panel_1.columnWidths = new int[]{0, 0, 0}; 
    gbl_panel_1.rowHeights = new int[]{0, 0}; 
    gbl_panel_1.columnWeights = new double[]{0.0, 1.0, Double.MIN_VALUE}; 
    gbl_panel_1.rowWeights = new double[]{0.0, Double.MIN_VALUE}; 
    panel_1.setLayout(gbl_panel_1); 

    JLabel lblNombre = new JLabel("Name"); 
    GridBagConstraints gbc_lblNombre = new GridBagConstraints(); 
    gbc_lblNombre.insets = new Insets(0, 0, 0, 5); 
    gbc_lblNombre.anchor = GridBagConstraints.EAST; 
    gbc_lblNombre.gridx = 0; 
    gbc_lblNombre.gridy = 0; 
    panel_1.add(lblNombre, gbc_lblNombre); 

    textField = new JTextField(); 
    GridBagConstraints gbc_textField = new GridBagConstraints(); 
    gbc_textField.fill = GridBagConstraints.HORIZONTAL; 
    gbc_textField.gridx = 1; 
    gbc_textField.gridy = 0; 
    panel_1.add(textField, gbc_textField); 
    textField.setColumns(10); 

} 



} 

감사합니다.

+0

탭 모델, 즉 선택된 탭의 상태 변경으로 인해 change 이벤트가 트리거되므로 stateChanged 메서드가 호출 될 때 선택한 탭이 이제 "+"탭이됩니다 ... – MadProgrammer

+0

도움을 더 빨리, [SSCCE] (http://sscce.org/)에 게시하십시오. –

답변

3

, 대신에 "추가"탭의를, 당신은 같은 뭔가를 "삽입"할 필요가 ... 예를 들어

Component tabComp = ... 
tab.insertTab("Title", null, tabComp, null, index); 

, index는 새 탭을 추가 할 위치입니다. 마지막에 "+"를 유지하려는 경우 tab.getTabCount() - 1과 같은 것이 트릭을 사용해야합니다.

마지막 활성 탭 옆에 탭을 추가하려면 좀 더 모험을해야합니다. ..

stateChanged 이벤트가 발생하면 선택 항목이 이미 변경되어 있으므로 tab.getSelectedIndex()은 항상 "+"탭을 반환합니다.

알아 두어야 할 사항은 이전에 선택한 탭입니다.

상태가 변경 될 때 선택한 탭을 검사 할 수 있습니다. "+"탭이 아닌 경우 선택한 인덱스 값을 기록 할 수 있습니다.

의 "+"탭이 활성화 될 때, 당신은 단순히 당신이 새로운 탭을 삽입하기위한 거점으로 추적되는 한 "마지막으로 선택한 인덱스"값 ... 예를 들어

를 ... 사용하는 것이

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTabbedPane; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class TestTabSelection { 

    public static void main(String[] args) { 
     new TestTabSelection(); 
    } 

    public TestTabSelection() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       final JTabbedPane tab = new JTabbedPane(); 
       tab.addTab("A", new JPanel()); 
       tab.addTab("+", new JPanel()); 
       tab.getModel().addChangeListener(new ChangeListener() { 
        private int lastSelected; 
        private boolean ignore = false; 

        @Override 
        public void stateChanged(ChangeEvent e) { 
         if (!ignore) { 
          ignore = true; 
          try { 
           int selected = tab.getSelectedIndex(); 
           String title = tab.getTitleAt(selected); 
           if ("+".equals(title)) { 
            JPanel pane = new JPanel(); 
            tab.insertTab("Tab" + (tab.getTabCount() - 1), null, pane, null, lastSelected + 1); 
            tab.setSelectedComponent(pane); 
           } else { 
            lastSelected = selected; 
           } 
          } finally { 
           ignore = false; 
          } 
         } 
        } 
       }); 
       final JButton btn = new JButton("Add"); 
       btn.addActionListener(new ActionListener() { 
        @Override 
        public void actionPerformed(ActionEvent e) { 
         System.out.println(tab.getTabCount()); 
        } 
       }); 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(tab); 
       frame.add(btn, BorderLayout.SOUTH); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

} 
+0

완벽한 !!! 감사 !!! – TSW1985

+0

걱정 마세요, 도움이 되니 기쁩니다 ... – MadProgrammer

0

난 당신을위한 해결책이 있습니다

tab.setTabComponentAt(tab.getTabCount() - 1, new PanelDinamicoPanel()); 
tab.addTab("+", null); 

희망하는 데 도움이, 기본적으로 살람

+0

감사합니다 살람,하지만 작동하지, 난 탭에 새 양식 있어요! – TSW1985

+0

죄송합니다. 즉석에서 그렇게했습니다. P 유일한 문제는 새 탭에 제목이 없다는 것이고, 나는 당신을 위해 진짜 시험을 볼 것입니다! – BilalDja

관련 문제