2016-09-15 3 views
1

Ich schaffe haben einen einfachen Code:Wählen Sie die Registerkarte nach Titel

import javax.swing.*; 
import java.awt.event.*; 
import java.awt.*; 
class tab extends JFrame 
{ 
    JTabbedPane tab=new JTabbedPane(); 
    JTextField input=new JTextField(); 
    JButton button=new JButton("process"); 
    tab() 
    { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(600,600); 
     setLocation(100,100); 
     setLayout(new BorderLayout()); 
     add(tab,"Center"); 

      tab.add("code",new JPanel()); 
      tab.add("assembly",new JPanel()); 
      tab.add("compiler",new JPanel()); 
      tab.add("Execution",new JPanel()); 
      tab.add("Structure",new JPanel()); 

     JPanel panel=new JPanel(); 
     add(panel,"South"); 
      panel.setLayout(new BorderLayout()); 
      panel.add(input,"Center"); 
      panel.add(button,"East"); 

     button.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent e) 
      { 
       tab.setSelectedIndex(Integer.parseInt(input.getText())); 
      } 
     }); 

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

dieser Code kann ausgewählt Reiter durch den Index.

in meiner Frage, wie man Tab durch Finden des Titels auswählt. Wenn ich also "Compiler" eingabe, kann ich den Titel "Compiler" auswählen.

Antwort

2

Einfach: tun Sie Ihre eigene Haushalt: Sie erstellen eine Map<String, Component> componentsByName; Und wenn Sie eine Komponente zu Ihrem TabbedPane hinzufügen, fügen Sie diese Komponente ebenfalls zu dieser Map hinzu.

Natürlich möchten Sie das so bequem wie möglich machen; so sollten Sie so etwas wie tun:

public class Tab extends JFrame { 
    private final JTabbedPane tab=new JTabbedPane(); 
    private final Map<String, Component> componentsByName = new HashMap<>(); 

    ... 
    private void addComponentToPaneAndMap(String title, Component component) { 
    tab.add(title, component); 
    componentsByName.put(title, component); 
    } 

(na ja, nicht nur für die Bequemlichkeit, sondern auch, um sicherzustellen, dass alle Komponenten, die auch in die Karte gehen in der Scheibe gehen!)

Und dann ersetzen Sie einfach

tab.add("code",new JPanel()); 

mit

addComponentToPaneAndMap("code", new JPanel()); 

Und später, wenn Sie auf eine der Komponenten in Ihrem Tab zugreifen müssen; Sie kann wie eine einfache Lookup:

Component someComponent = componentsByName.get("compiler"); 

Bitte beachten Sie:

  1. I "fixed" der Name Ihrer Klasse - Klassennamen immer mit Großbuchstaben beginnen.
  2. Ich habe Ihre Felder geändert, um privat zu sein & final - das ist wie der "Standard", den Sie anstreben sollten: stellen Sie sicher, dass die Interna Ihrer Klassen bleiben intern (mit privaten); und dass du dir keine Sorgen machen musst, dass du versehentlich ihren Inhalt überschreibst (mit final).

Wenn Sie glauben, diese oft mehr benötigen, wäre es auch sinnvoll sein, eigene Unterklasse von JTabbedPane zu schaffen, die die oben genannten Mechanismen verwendet und bereits Methoden entsprechende Getter zur Verfügung stellt.

+0

können Sie Beispiel aus meinem Code machen? Ich fühle mich ein wenig schwer zu verstehen, deine Antwort, es tut mir leid, ich bin Anfänger. – newbie

+0

Es scheint so. Schauen Sie genau hin: Der Code, den ich in meine Antwort geschrieben habe, soll einfach zu Ihrer aktuellen Codebasis hinzugefügt werden **. Nun, ein kleines Stück fehlte; was ich in einer Sekunde hinzufügen werde. Mit anderen Worten: Sie haben bereits eine Lösung für Ihre Code-Basis in Handarbeit erstellt. Versteh mich jetzt nicht falsch: Wenn deine Fähigkeiten wirklich auf einem Level sind, dass du das nicht verstehst; dann würde ich vorschlagen, dass du jetzt aufhören solltest, UI-Sachen zu schreiben.Denn dann fehlt es an super-basischem Wissen über Java. Dann sollten Sie zuerst diese ** Grundlagen ** lernen; anstatt zu versuchen, UI-Anwendungen zu erstellen. – GhostCat

+0

OK; aktualisierte meine Antwort. Es enthält wirklich alle Elemente, die Sie jetzt brauchen; Sie müssen sie nur in Ihren Code ziehen! Lass es mich wissen, wenn es für dich funktioniert; und wenn ja, vergiss nicht, die Antwort zu akzeptieren ;-) – GhostCat

3

Sie können einfach die Tabs iterieren und den Index des einen mit dem angegebenen Namen finden:

public int findTabByName(String title, JTabbedPane tab) 
{ 
    int tabCount = tab.getTabCount(); 
    for (int i=0; i < tabCount; i++) 
    { 
    String tabTitle = tab.getTitleAt(i); 
    if (tabTitle.equals(title)) return i; 
    } 
    return -1; 
} 

Dann im Code rufen Sie einfach findTabByName(), die die Benutzereingabe (und die compoenent), und wenn der zurückgegebene index ist nicht -1 können Sie anrufen tab.setSelectedIndex()

+0

Was ist Index? – newbie

+0

@newbie: Entschuldigung, Tippfehler. Das sollte "i" sein (die Variable aus der Schleife) –

+0

sollte ich 'findTabByName (" Compiler ", Registerkarte) schreiben;' in Button-Listener? Ich scheine nicht zu funktionieren. – newbie

Verwandte Themen