2016-05-01 3 views
0

Betrachten wir zwei Klassen:Finden Sie heraus, welche Option in benutzerdefinierten Komponente Registerkarten ausgewählt wurde

public class Test 
{ 
    private boolean skip = false; 
    private JLabel label = ""; 

    public boolean isSkipped() 
    { 
     return skip; 
    } 

    public void setSkipped(boolean skip) 
    { 
     this.skip = skip; 
    } 

    public void setLabel(String string) 
    { 
     label.setText(string); 
    } 
} 

und MainWindow Klasse, die wir annehmen, dass hat alle Felder und Methoden für einfachen Rahmen erforderlich angezeigt werden. In dieser Klasse haben wir auch:

private JTabbedPane tabPane = new JTabbedPane(); 
private ArrayList<Test> test = new ArrayList<>(); 

for(int i = 0; i < 30; i++) 
{ 
    test.add(new Test()); 
} 

JPanel checkBoxTab = new JPanel(); 
JCheckBox checkBox = new JCheckBox(); 

checkBox.addItemListener(new ItemListener() 
{ 
    @Override 
    public void itemStateChanged(ItemEvent e) 
    { 
     if(e.getStateChange() == ItemEvent.SELECTED) 
     { 
      test.get(?).setSkipped(true); 
     } 

     if(e.getStateChange() == ItemEvent.DESELECTED) 
     { 
      test.get(?).setSkipped(false); 
     } 

     for(int j = 0, k = 1; j < test.size(); j++) 
     { 
      if(test.get(j).isSkipped()) 
      { 
        continue; 
      } 

      test.get(j).setLabel("" + k); 
      k++; 
     } 
    } 
}); 

    checkBox.setOpaque(false); 
    checkBoxTab.add(checkBox); 
    checkBoxTab.setOpaque(false); 

for(int i = 0; i < test.size(); i++) 
{ 
    tabPane.addTab("", test.get(i)); 
    tabPane.setTabComponentAt(i, checkBoxTab); 
} 

Meine Frage ist: Wie ersetze ich die ? Zeichen mit dem Index der Registerkarte, die die chackbox hat, die ausgewählt wurde? Ich muss es während des Programmlaufs dynamisch finden. Der Zweck dieses Codes besteht darin, herauszufinden, welche Registerkarte ausgewählt wurde, sie zu überspringen, sie ohne Zuweisung der nächsten Zahl von k zu einer Markierung zu überspringen und die nächste Zahl von k der nächsten Registerkarte zuzuweisen (vorausgesetzt, sie ist nicht zum Überspringen markiert und wenn es ist - wiederhole den vorherigen Prozess. Ich habe versucht, die Lösung hier zu verstehen Close the clicked tab, not the currently selected tab JTabbedPane, aber ich sehe nicht wirklich, wie ich das "Tab Content" -Ding implementieren könnte. Abgebildet vorherige wir haben:

tabCount: 0 1 2 3 4 5 6 7 8 
skip:  f t f t t f f f t 
label: 1 2  3 4 5 

EDIT leider ein Tippfehler in MainWindow Klasse

+0

Welche Beziehung hat der 'JCheckBox' haben die Registerkarte? Sind sie in der Kopfzeile der Registerkarte enthalten? Die Registerkarte selbst? Oder sind die getrennt? – MadProgrammer

+0

Tab-Header wie hier im Abschnitt Tabs mit benutzerdefinierten Komponenten https://docs.oracle.com/javase/tutorial/uiswing/components/tabbedpane.html – Colonder

+0

Konzeptionell könnten Sie etwas tun wie [dies] (http: // stackoverflow.com/questions/11553112/how-to-add-close-button-to-a-jtabbedpane-tab/11553266#11553266) – MadProgrammer

Antwort

0

Mit Hilfe von Mad Programmierers Kommentar war ich es geschafft, das umzusetzen, was ich wollte

checkBox.addItemListener(new ItemListener() 
{ 
    @Override 
    public void itemStateChanged(ItemEvent e) 
    { 
     if(e.getStateChange() == ItemEvent.SELECTED) 
     { 
      test.get(tabbedPane.indexOfTab(tabName)).setSkipped(true); 
     } 

     if(e.getStateChange() == ItemEvent.DESELECTED) 
     { 
      test.get(tabbedPane.indexOfTab(tabName)).setSkipped(false); 
     } 

     for(int j = 0, k = 1; j < test.size(); j++) 
     { 
      if(test.get(j).isSkipped()) 
      { 
       continue; 
      } 

      test.get(j).setLabel("" + k); 
      k++; 
     } 
    } 
}); 
Verwandte Themen