Java JTabbedPane

Baenedikt

Cadet 1st Year
Registriert
Juni 2011
Beiträge
11
Logik bei JTabbedPane?!

Hallo,

ich habe folgendes Problem: ich verstehe nicht, wie man einzelne Fenster/Layouts/Label usw. den verschiedenen Tabs speziell zuordnen kann. Anders ausgedrückt: Wie muss das im Quellcode aussehen, wenn ich einem einzelnen Tab mit einem speziellen Index (z.B. 0, 1, 2, 3 usw.) einen Button hinzufügen will. Vllt könnt ihr schnell mal drüber schauen, was ich bisher geschrieben habe:

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 14.06.2011
  * @author
  */

public class LIGAMANAGER extends JFrame {
  // Anfang Attribute
  private JTabbedPane jTPane = new JTabbedPane();
    private Panel jTPaneTabPanel1 = new Panel();
    private Panel jTPaneTabPanel2 = new Panel();
    private Panel jTPaneTabPanel3 = new Panel();
    private Panel jTPaneTabPanel4 = new Panel();
  private JLabel jLabelMannschaften = new JLabel();
  private JLabel jLabelMannschaft1 = new JLabel();
  private JTextField Mannschaft1 = new JTextField();
  private JLabel VS = new JLabel();
  private JTextField Mannschaft2 = new JTextField();
  private JButton Beenden = new JButton();
  private JButton Weiter = new JButton();
  // Ende Attribute

  public LIGAMANAGER(String title) {
    // Frame-Initialisierung
    super(title);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    int frameWidth = 635;
    int frameHeight = 488;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    Container cp = getContentPane();
    cp.setLayout(null);
    // Anfang Komponenten

    jTPane.setBounds(0, 0, 615, 33);
    jTPane.setTabPlacement(JTabbedPane.TOP);
    jTPane.setSelectedIndex(0);
    jTPane.addChangeListener(new ChangeListener() {
      public void stateChanged(ChangeEvent evt) {
        jTPane_StateChanged(evt);
      }
    });
    cp.add(jTPane);
    jTPane.addTab("Mannschaften", jTPaneTabPanel1);
    jTPane.addTab("Austragungsort", jTPaneTabPanel2);
    jTPane.addTab("Spielstand", jTPaneTabPanel3);
    jTPane.addTab("Fertig", jTPaneTabPanel4);
    jLabelMannschaften.setBounds(24, 56, 484, 24);
    jLabelMannschaften.setText("Tragen sie die gewünschten Mannschaften ein!");
    jLabelMannschaften.setFont(new Font("Arial", Font.BOLD, 19));
    cp.add(jLabelMannschaften);
    jLabelMannschaft1.setBounds(32, 120, 151, 16);
    jLabelMannschaft1.setText("Mannschaften eingeben:");
    jLabelMannschaft1.setFont(new Font("Arial", Font.PLAIN, 13));
    cp.add(jLabelMannschaft1);
    Mannschaft1.setBounds(40, 176, 241, 24);
    Mannschaft1.setText("Hier Mannschaft 1 eintragen!");
    Mannschaft1.setToolTipText("Tragen Sie hier Mannschaft 1 ein!");
    Mannschaft1.addMouseListener(new MouseAdapter() {
      public void mouseClicked(MouseEvent evt) {
        Mannschaft1_MouseClicked(evt);
      }
    });
    cp.add(Mannschaft1);
    VS.setBounds(296, 176, 37, 19);
    VS.setText("VS.");
    VS.setFont(new Font("Arial", Font.BOLD, 16));
    cp.add(VS);
    Mannschaft2.setBounds(344, 176, 241, 24);
    Mannschaft2.setText("Hier Mannschaft 2 eintragen!");
    Mannschaft2.setToolTipText("Tragen Sie hier Mannschaft 2 ein!");
    Mannschaft2.addMouseListener(new MouseAdapter() {
      public void mouseClicked(MouseEvent evt) {
        Mannschaft2_MouseClicked(evt);
      }
    });
    cp.add(Mannschaft2);
    Beenden.setBounds(464, 400, 145, 41);
    Beenden.setText("Beenden");
    Beenden.setMargin(new Insets(2, 2, 2, 2));
    Beenden.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        Beenden_ActionPerformed(evt);
      }
    });
    Beenden.setToolTipText("Hier Klicken um zu beenden!");
    cp.add(Beenden);
    Weiter.setBounds(288, 400, 145, 41);
    Weiter.setText("Weiter");
    Weiter.setMargin(new Insets(2, 2, 2, 2));
    Weiter.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        Weiter_ActionPerformed(evt);
      }
    });
    cp.add(Weiter);
    // Ende Komponenten

    setResizable(false);
    setVisible(true);
  }

  // Anfang Methoden

  //Wenn der Button "Beenden" geklickt wird, wird das Programm (unter der Bedingung 0) geschlossen.
  public void Beenden_ActionPerformed(ActionEvent evt) {
    System.out.println("Danke, dass Sie den Ligamanager verwendet haben!");
    System.exit(0);
  }

  //Wenn auf den Button "Weiter" geklickt wird, wird sich der Index des aktuellen Tabs geholt. Sollte der Index gleich 3 sein (was ja der Tab "Fertig" und damit der letzte Tab ist), kann nicht weiter geklickt werden, sondern es wird alles Angegebene übertragen und dann das Programm beendet.
  public void Weiter_ActionPerformed(ActionEvent evt) {
     if(jTPane.getSelectedIndex()!= 3){
           jTPane.getComponentAt(jTPane.getSelectedIndex()+1);
     }
     else{
        Beenden_ActionPerformed(evt);
     }
  }

  //Sorgt dafür, dass das Text-Feld "Mannschaft1" geleert wird, sobald man hineinklickt.
  public void Mannschaft1_MouseClicked(MouseEvent evt) {
    Mannschaft1.setText("");
  }

  //Sorgt dafür, dass das Text-Feld "Mannschaft2" geleert wird, sobald man hineinklickt.
  public void Mannschaft2_MouseClicked(MouseEvent evt) {
    Mannschaft2.setText("");
  }

  public void jTPane_StateChanged(ChangeEvent evt) {
  if(jTPane.getSelectedIndex() != 3){
       jTPane.getComponentAt(jTPane.getSelectedIndex()+1);
  }
  }

  // Ende Methoden

  //Main-Methode, die das Programm starten. Dies ist möglich, da diese static ist, d.h. sie kann ausgeführt werden ohne, dass es ein Objekt der Klasse gibt.
  public static void main(String[] args) {
    new LIGAMANAGER("LIGAMANAGER");
  }
}

Wie ihr seht habe ich jetzt erstmal ein Fenster für den ersten Tab "Mannschaften" aber jetzt kommt mein Problem:
wie bzw. wo kann ich, wenn ich jetzt einen anderen Tab auswähle in diesem "tab-fenster" meine Button/labels usw. einfügen?

Wäre euch echt dankbar, wenn ihr mir helfen könnten! Wenn ihr fragen zum Quellcode habt (bezüglich der Funktionen der einzelnen Methoden) dann fragt einfach!

Thx,

Baenedikt
 
Erstmal musst du die tabs hinzufügen, bevor du den index setzt, sonst crasht es doch schon beim Start.
Und wie du Elemente zu den tabs hinzufügst? Na einfach mit
Code:
jTPaneTabPanel1.add(...)
Btw - sind das absichtlich Panels statt JPanels?
 
Danke erstmal für die schnelle Hilfe!

@Tumbleweed:
...sind das absichtlich Panels statt JPanels?
- Ich dachte das sind JPanels, jedenfalls habe ich das beabsichtigt, als ich im Java-Editor unter der Rubrik "Swing 2" die Tabs ausgewählt hatte. Der Quellcode wurde ja dann teilweise schon von dem Editor selber erstellt. Daher dacht ich, dass es daran egtl nichts auszusetzen gibt! Oder gibt es da was? Ich meine funktioniert es nicht auch so?

Heißt das jetzt, dass ich egtl den eigentlichen Tabs noch keine speziellen Fenster zugewiesen habe? Sonder einfach nur ein Fenster, wo oben zwar Tabs sind, aber die anderweitig keine Funktion haben oder?

@e-Laurin: danke dir!
 
Ob JPanel oder Panel ist vermutlich vorerst egal. Ich müsste selbst nochmal in der API kramen, um Unterschiede zu finden (abgesehen davon, dass Panels AWT sind und JPanels Swing). Solange du auf keine seltsamen Fehler triffst, ist das erst mal nicht so wichtig und auch später noch relativ leicht zu ändern. Allerdings wurde früher mal generell abgeraten, das Zeug zu mixen, obwohl sich das anscheinend inzwischen geändert hat. Kannst ja mal hier lesen, wenn du es genauer wissen willst.

Im Moment fügst du alle Elemente wie Knöpfe und Labels der content pane des JFrames (also des gesamten Fensters) hinzu. Das willst du aber eigentlich nicht, sondern du willst sie den einzelnen tabs hinzufügen. Lies dir nochmal deinen code Zeile für Zeile durch und schau besonders auf sämtliche .add calls und überlege dir, ob das so Sinn ergibt. Und lass besser für den Anfang die Finger von GUI Editoren, bis du etwas besser verstanden hast, was da eigentlich vor sich geht. ;)
 
Zuletzt bearbeitet:
:) ja ich sehe schon, es bedarf noch viel an Zeit bis ich es vollends durchstiegen habe^^ Aber die Editoren kkönnen schon helfen das schritt für schritt zu durchsteigen!

Im Moment fügst du alle Elemente wie Knöpfe und Labels der content pane des JFrames (also des gesamten Fensters) hinzu
Das ist soweit ich richtig verstanden habe immer dieses:
Code:
 cp.add(...);
oder?
d.h. dieses einfach durch das ersetzen, was du als 1. gepostet hast und dann passt des :)

Bzgl. des Mixen von Swing und AWT zerbreche ich mir hier einfach mal keinen Kopf, ich schaue dass ich das erst mal zum laufen bringe!

Eine Frage noch:
Wenn ich jetzt den Tabs verschiedene Sachen hinzugefügt habe, was macht es da für einen Sinn dem content pane iwas hinzuzufügen? Überflüssig, manchmal benötigt oder funktioniert das nicht?

Thx
 
Ja genau, cp ist bei dir die content pane und mit add fügst du beliebige components hinzu.

In deinem Fall wirst du die content pane vermutlich gar nicht brauchen, es sei denn, deine tabbed pane füllt nicht das ganze Fenster aus und es gibt andere Dinge die dahinter liegen. Ich muss gestehen, dass ich die content pane immer recht stiefmütterlich behandelt habe. Ich habe dem JFrame meistens mein eigenes JPanel aufgedrückt bzw. ein Objekt einer Klasse, die JPanel extended. So kann man z.B. auch mit setContentPane des JFrames selbst auswählen, was als content pane gesetzt ist. Allerdings weiß ich da nicht, welche ungewünschten Nebeneffekte man damit auslösen kann.

Also bleib bei deiner tabbed pane als Grundlage und füge dort immer weiter tabs hinzu und zu den tabs eben die anzuzeigenden Elemente.
 
So ich bin´s nochmal! Ich habe das jetzt abgeändert, bekomme aber immernoch eine Fehlermeldung, die aber meiner Meinung nach etwas mit der main-Methode zu tun hat.
Oder liegt es immernoch an meiner falschen JTabbedPane-Implementierung?

Hier mein Code:

Code:
mport java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 14.06.2011
  * @author
  */

public class LIGAMANAGER extends JFrame {
  // Anfang Attribute
  private JTabbedPane jTPane = new JTabbedPane();
    private Panel jTPaneTabPanel1 = new Panel();
    private Panel jTPaneTabPanel2 = new Panel();
    private Panel jTPaneTabPanel3 = new Panel();
    private Panel jTPaneTabPanel4 = new Panel();
  private JLabel jLabelMannschaften = new JLabel();
  private JLabel jLabelMannschaft1 = new JLabel();
  private JTextField Mannschaft1 = new JTextField();
  private JLabel VS = new JLabel();
  private JTextField Mannschaft2 = new JTextField();
  private JButton Beenden = new JButton();
  private JButton Weiter = new JButton();
  // Ende Attribute

  public LIGAMANAGER(String title) {
    // Frame-Initialisierung
    super(title);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    int frameWidth = 635;
    int frameHeight = 488;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    Container cp = getContentPane();
    cp.setLayout(null);
    // Anfang Komponenten

    jTPane.setBounds(0, 0, 615, 33);
    jTPane.setTabPlacement(JTabbedPane.TOP);
    jTPane.setSelectedIndex(0);
    jTPane.addChangeListener(new ChangeListener() {
      public void stateChanged(ChangeEvent evt) {
        jTPane_StateChanged(evt);
      }
    });
    //cp.add(jTPane);

    jTPane.addTab("Mannschaften", jTPaneTabPanel1);
    jTPane.addTab("Austragungsort", jTPaneTabPanel2);
    jTPane.addTab("Spielstand", jTPaneTabPanel3);
    jTPane.addTab("Fertig", jTPaneTabPanel4);
    jLabelMannschaften.setBounds(24, 56, 484, 24);
    jLabelMannschaften.setText("Tragen sie die gewünschten Mannschaften ein!");
    jLabelMannschaften.setFont(new Font("Arial", Font.BOLD, 19));
    //cp.add(jLabelMannschaften);
    jTPaneTabPanel1.add(jLabelMannschaften);
    jLabelMannschaft1.setBounds(32, 120, 151, 16);
    jLabelMannschaft1.setText("Mannschaften eingeben:");
    jLabelMannschaft1.setFont(new Font("Arial", Font.PLAIN, 13));
    //cp.add(jLabelMannschaft1);
    jTPaneTabPanel1.add(jLabelMannschaft1);
    Mannschaft1.setBounds(40, 176, 241, 24);
    Mannschaft1.setText("Hier Mannschaft 1 eintragen!");
    Mannschaft1.setToolTipText("Tragen Sie hier Mannschaft 1 ein!");
    Mannschaft1.addMouseListener(new MouseAdapter() {
      public void mouseClicked(MouseEvent evt) {
        Mannschaft1_MouseClicked(evt);
      }
    });
    //cp.add(Mannschaft1);
    jTPaneTabPanel1.add(Mannschaft1);
    VS.setBounds(296, 176, 37, 19);
    VS.setText("VS.");
    VS.setFont(new Font("Arial", Font.BOLD, 16));
    //cp.add(VS);
    jTPaneTabPanel1.add(VS);
    Mannschaft2.setBounds(344, 176, 241, 24);
    Mannschaft2.setText("Hier Mannschaft 2 eintragen!");
    Mannschaft2.setToolTipText("Tragen Sie hier Mannschaft 2 ein!");
    Mannschaft2.addMouseListener(new MouseAdapter() {
      public void mouseClicked(MouseEvent evt) {
        Mannschaft2_MouseClicked(evt);
      }
    });
    //cp.add(Mannschaft2);
    jTPaneTabPanel1.add(Mannschaft2);
    Beenden.setBounds(464, 400, 145, 41);
    Beenden.setText("Beenden");
    Beenden.setMargin(new Insets(2, 2, 2, 2));
    Beenden.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        Beenden_ActionPerformed(evt);
      }
    });
    Beenden.setToolTipText("Hier Klicken um zu beenden!");
    //cp.add(Beenden);
    jTPaneTabPanel1.add(Beenden);
    Weiter.setBounds(288, 400, 145, 41);
    Weiter.setText("Weiter");
    Weiter.setMargin(new Insets(2, 2, 2, 2));
    Weiter.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        Weiter_ActionPerformed(evt);
      }
    });
    //cp.add(Weiter);
    jTPaneTabPanel1.add(Weiter);
    // Ende Komponenten

    setResizable(false);
    setVisible(true);
  }

  // Anfang Methoden

  //Wenn der Button "Beenden" geklickt wird, wird das Programm (unter der Bedingung 0) geschlossen.
  public void Beenden_ActionPerformed(ActionEvent evt) {
    System.out.println("Danke, dass Sie den Ligamanager verwendet haben!");
    System.exit(0);
  }

  //Wenn auf den Button "Weiter" geklickt wird, wird sich der Index des aktuellen Tabs geholt. Sollte der Index gleich 3 sein (was ja der Tab "Fertig" und damit der letzte Tab ist), kann nicht weiter geklickt werden, sondern es wird alles Angegebene übertragen und dann das Programm beendet.
  public void Weiter_ActionPerformed(ActionEvent evt) {
     if(jTPane.getSelectedIndex()!= 3){
           jTPane.getComponentAt(jTPane.getSelectedIndex()+1);
     }
     else{
        Beenden_ActionPerformed(evt);
     }
  }

  //Sorgt dafür, dass das Text-Feld "Mannschaft1" geleert wird, sobald man hineinklickt.
  public void Mannschaft1_MouseClicked(MouseEvent evt) {
    Mannschaft1.setText("");
  }

  //Sorgt dafür, dass das Text-Feld "Mannschaft2" geleert wird, sobald man hineinklickt.
  public void Mannschaft2_MouseClicked(MouseEvent evt) {
    Mannschaft2.setText("");
  }

  public void jTPane_StateChanged(ChangeEvent evt) {
  if(jTPane.getSelectedIndex() != 3){
       jTPane.getComponentAt(jTPane.getSelectedIndex()+1);
  }
  }

  // Ende Methoden

  //Main-Methode, die das Programm starten. Dies ist möglich, da diese static ist, d.h. sie kann ausgeführt werden ohne, dass es ein Objekt der Klasse gibt.
  public static void main(String[] args) {
    new LIGAMANAGER("LIGAMANAGER");
  }
}
 
Du führst immer noch
Code:
jTPane.setSelectedIndex(0);
aus, bevor du die tabs hinzufügst. Das habe ich aber schon in der ersten Antwort geschrieben. ;)
 

Ähnliche Themen

Zurück
Oben