Swing JTabbedPane mit JButton einen anderen Tab anzeigen

piplack

Mitglied
Hallo,

ich möchte bei Klick auf einen bestimmten JButton, dass ein anderer Tab angezeigt wird.

Der JButton ist mit einem ActionListener hinterlegt.
Ich habe es bereits mit den methoden

getSelectedIndex();
setSelectedIndex(indx);

versucht, aber er bleibt immer noch bei der alten Tab.
Wie kann ich im ActionListener die richtige Tab ansteuern?
 
setSelectedIndex(indx) sollte funktionieren laut How to Use Tabbed Panes (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)
To switch to a specific tab programmatically, use the setSelectedIndex or the setSelectedComponent methods.

kannst du ein kurzes ausführbares Beispielprogramm posten?
Ala
Java:
	public static void main(String[] args) throws Exception {
		JFrame frame = new JFrame();
		JPanel panel = new JPanel();
		final JTabbedPane tabbed = new JTabbedPane();
		JButton btn = new JButton("button1");
		btn.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				tabbed.setSelectedIndex(1); //switch to tab2
			}
		});
		panel.add(btn);
		JPanel panel2 = new JPanel();
		panel2.add(new JButton("button2"));
		tabbed.addTab("tab1", panel);
		tabbed.addTab("tab2",panel2);
		frame.add(tabbed);
		frame.pack();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
	}
 
Java:
public class Startview1 extends JFrame implements Observer, MouseListener, ChangeListener, WindowListener{

	Startmodel startmodel;
	
	private static TextField spieler1;				//tab neuesSpiel
	private static TextField spieler2;		
	private static JComboBox breite = new JComboBox();
	private static JComboBox hoehe = new JComboBox();
	private String[] anzahlKaestchen = {"4","5","6","7", "8", "9", "10"}; //Fuellung fuer die JComboBox
	private JButton spielStarten;
	private JButton abbrechen;
	
...
	

	static JTabbedPane tabs;
	
	public Startview1(Startmodel sm){
		
		startmodel = sm;
		
		Container ct1 = this.getContentPane();
		setTitle("Kaesekaestchen");	
		
	/*
	 * Register erstellen als neue Panels
	 */
		JPanel neuesSpiel = new JPanel();
		JPanel spielLaden = new JPanel();
		JPanel spielfeld = new JPanel();
		JPanel anLeitung = new JPanel();
		
	/*
	 * Pane erstellen, die ihre Registerkarte oben ausgerichtet hat
	 */
		JTabbedPane tabs = new JTabbedPane();
		
	/*
	 * Panels (Register) zur Pane hinzufügen
	 */
		tabs.addTab(null, neuesSpiel);
		tabs.setTabComponentAt(0, new JLabel("Neues Spiel"));
		tabs.addTab(null, spielLaden);
		tabs.setTabComponentAt(1, new JLabel("Spiel laden"));
		tabs.addTab(null, spielfeld);
		tabs.setTabComponentAt(2, new JLabel("Spielfeld"));
		tabs.addTab(null, anLeitung);
		tabs.setTabComponentAt(3, new JLabel("Anleitung"));
		
	/*
	 * Register "neues Spiel" 
	 */
		neuesSpiel.setLayout(new GridLayout(5, 3, 10, 10));
		
		JLabel jl1;
		neuesSpiel.add(jl1 = new JLabel("Spieler 1: "));
		neuesSpiel.add(spieler1 = new TextField("Name?"));
		spieler1.setName("Spieler1");
		spieler1.addMouseListener(this);
		spieler1.addActionListener(new Startcontroller(this));
		
		JLabel jl2;
		neuesSpiel.add(jl2 = new JLabel(" Farbe:  rot / Zeichen: X"));
		jl2.setBorder(new LineBorder (Color.red, 2));
		
		neuesSpiel.add(new JLabel("Spieler 2: "));
		neuesSpiel.add(spieler2 = new TextField("Name?"));
		spieler2.setName("Spieler2");
		spieler2.addMouseListener(this);
		spieler2.addActionListener(new Startcontroller(this));
		
		JLabel jl3;
		neuesSpiel.add(jl3 = new JLabel(" Farbe:  blau / Zeichen: O"));
		jl3.setBorder(new LineBorder (Color.blue, 2));
		
		neuesSpiel.add(new JLabel("Spielfeldgröße: "));
		breite.setName("breite");
		breite = new JComboBox(anzahlKaestchen);
		neuesSpiel.add(breite);
		breite.addActionListener(new Startcontroller (this));
		
		neuesSpiel.add(new JLabel("= Breite"));
		neuesSpiel.add(new JLabel("" ));
		
		hoehe = new JComboBox(anzahlKaestchen);
		hoehe.setName("hoehe");
		hoehe.setEnabled(false);
		neuesSpiel.add(hoehe);
		
		neuesSpiel.add(new JLabel("= Hoehe"));
		neuesSpiel.add(new JLabel(""));
		
		neuesSpiel.add(spielStarten = new JButton("Spiel starten"));
		spielStarten.setName("spielStart");
		
		neuesSpiel.add(abbrechen = new JButton("Abbrechen"));
		abbrechen.setName("abbrechen");
	
		spielStarten.addActionListener(new Startcontroller (this));
		abbrechen.addActionListener(new Startcontroller (this));
Startcontroller-Klasse:
Java:
public class Startcontroller implements ActionListener, ChangeListener{

	private Startview1 startview1;
	private Startmodel startmodel;


	public Startcontroller(Startview1 startview1) {
	this.startview1 = startview1;	
	}
	
	public Startmodel getStartmodel() {
		return startmodel;
	}

	public void setStartmodel(Startmodel startmodel) {
		this.startmodel = startmodel;
	}

	public Startview1 getStartview1() {
		return startview1;
	}

	public void setStartview1(Startview1 startview1) {
		this.startview1 = startview1;
	}

	public void actionPerformed(ActionEvent e) {
		
		if (e.getSource() instanceof JButton) {
		
			if (((JButton) e.getSource()).getName().equals("spielStart")) {

...
				
				if (!Startview1.getSpieler1().getText().isEmpty()) {
					Startview1.getSpielerA1().setText(Startview1.getSpieler1().getText());
					Startview1.getSpielerB1().setText(Startview1.getSpieler2().getText());
					Startview1.getSpielerA2().setText(Startview1.getSpieler1().getText());
					Startview1.getSpielerB2().setText(Startview1.getSpieler2().getText());
				
	

					int x = 2;					
					Startview1.getTabs().getSelectedIndex();
					Startview1.getTabs().setSelectedIndex(x);

					System.out.println("Neues Spiel wird gestartet.");			
					
					}			
				
			}
			
			else if (((JButton) e.getSource()).getName() == "wahlSpiel") {
				System.out.println("Ausgewaehltes Spiel wird gestartet.");}
			
			else if (((JButton) e.getSource()).getName() == "abbrechen") {
				System.out.println("Spiel wird abgebrochen");	
				JDialog jd1 = new JDialog();
				JOptionPane.showMessageDialog(jd1, 
						"Die Anwendung wird jetzt geschlossen! \n" +
						"Bitte starten sie ggf. das Spiel erneut.",
				"Abbrechen", JOptionPane.WARNING_MESSAGE);
				System.exit(0); 	
			}
					
			else {
				System.out.println("Das war nichts");
			}
	}	
[/JAVA)]
Habe das wesentliche übertragen. Er hängt sich immer wieder nach dem int x auf.

Bin Anfängerin, bitte nicht nur irgendwelche Methoden hinwerfen. Davon habe ich die letzten Tage viel zu viele erfolglos versucht. Wenn es geht, bitte konkrete Vorschläge machen. Danke
 
Hi,

du musst in deiner actionPerformed Methode vom ActionListener auf dem JButton einfach folgendes machen.

tabs.setSelectedIndex(x);
für x muss die Zahl stehen an welcher Stelle der Tab ist.
0 der erste, 1 der zweite, 2 der dritte etc....
 
Habe ich ja versucht,

aber er spuckt mir immer einen Fehler aus:


Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Startview.Startcontroller.actionPerformed(Startcontroller.java:108)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)

in 107 /108 steht
int x = 2;
Startview1.getTabs().setSelectedIndex(x);

Weitere Tipps?
 
jetzt kommen so die üblichen vorgehensweisen..

Hast du wirklich 3 Tabpanes und sind diese auch schon erstellt und liegen nicht nur als Referenz vor?
 
Ja, ich habe Tab-Panes, es sind sogar 4 an der Zahl.

siehe hierzu den Codeauschnitt

/*
* Pane erstellen, die ihre Registerkarte oben ausgerichtet hat
*/
JTabbedPane tabs = new JTabbedPane();

/*
* Panels (Register) zur Pane hinzufügen
*/
tabs.addTab(null, neuesSpiel);
tabs.setTabComponentAt(0, new JLabel("Neues Spiel"));
tabs.addTab(null, spielLaden);
tabs.setTabComponentAt(1, new JLabel("Spiel laden"));
tabs.addTab(null, spielfeld);
tabs.setTabComponentAt(2, new JLabel("Spielfeld"));
tabs.addTab(null, anLeitung);
tabs.setTabComponentAt(3, new JLabel("Anleitung"));
 
Startview1.getTabs().setSelectedIndex(x);
Steht im Code tatsächlich Startview1 oder startview1? Ersteres ist der Name der Klasse (und wäre falsch) zweiteres ist der Name einer Referenz auf ein Objekt vom Typ StartView1.
Was liefert denn
Code:
startview1.getTabs()
? Eventuell gibt ja bereits die Methode null zurück.
 
öhm du legst oben deine tabpane als static an und unten sagst du nochmal TabbedPane = new Tab...
im actionlistener greift er aber auf die static pane zu. du musst unten lediglich schreiben tabs = new TabbedPane...
 

Zurück
Oben