programmatischer Fokuswechsel

Olli_M

Mitglied
Hallo allerseits

das Java-Fokus-System treibt mich mal wieder Nüsse... ???:L

Ich habe eine JTabbedPane mit etlichen Panels, zwischen denen ich hin- und herswitche.
Auf Tab B habe ich drei Buttons und mehrere Eingabefelder (JTextFields).
Drücke ich auf einen Button ("Abbrechen"), komme ich auf Tab A (Hauptpanel).
Soweit, so gut.

Nun will ich ein JTextField auf Tab A automatisch fokussieren (ohne dass der User selber reinklicken muss). Also nehme ich requestFocusInWindow(). Funktioniert auch oft, aber eben nicht unter allen Umständen.

Habe ich (auf Tab B) eine Eingabe in einem der Eingabefelder drin stehen, und klicke dann
auf Abbrechen, bekommt das JTextField auf Tab A den Fokus (ich checke "focusGained"),
verliert ihn dann aber automatisch wieder ("focusLost" wird unmittelbar danach gefeuert),
und ein unbeteiligter Button (wahrscheinlich der oberste der Hierarchie) kriegt den Fokus dann.
:bahnhof:

Habe ich keine Eingabe in dem Eingabefeld drinstehen (der Fokus kann aber ruhig dort drin sein),
und klicke dann auf Abbrechen, ist alles bestens, mein JTextField auf Panel A hat dann den Fokus,
und behält ihn auch.

Java 1.6.12, Windows XP

Kann ich eigentlich im IntelliJ im GUI Designer irgendwie die Tab-Reihenfolge der Komponenten anpassen, oder muss ich das per Code machen?!

viele Grüße

Olli
 

Camill

Bekanntes Mitglied
Hallo,

mit einem ComponentListener in dem jeweiligen Tab funktioniert das ganze - sofern ich dich richtig verstanden habe.

Java:
package de.demo.tabbedpane;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;

public class TabbedPaneDemo implements ActionListener {

	private Tab tab1;
	private Tab tab2;
	private JTabbedPane tabbedPane;

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

	private TabbedPaneDemo() {
		JFrame frame = new JFrame("TabbedPane-Demo");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(400, 200);
		frame.setLocationRelativeTo(null);

		JPanel content = new JPanel(new BorderLayout());
		frame.add(content);

		this.tab1 = new Tab(this, "goto tab 2");
		this.tab2 = new Tab(this, "goto tab 1");

		this.tabbedPane = new JTabbedPane();
		this.tabbedPane.addTab("Tab 1", this.tab1);
		this.tabbedPane.addTab("Tab 2", this.tab2);
		content.add(this.tabbedPane, BorderLayout.CENTER);

		frame.setVisible(true);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == this.tab1.getBtnChangeTab()) {
			this.tabbedPane.setSelectedComponent(this.tab2);
		}

		if (e.getSource() == this.tab2.getBtnChangeTab()) {
			this.tabbedPane.setSelectedComponent(this.tab1);
		}
	}
}

Java:
package de.demo.tabbedpane;

import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;

import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Tab extends JPanel {

	private static final long serialVersionUID = 1L;

	private TabbedPaneDemo demo;
	private JTextField tf1;
	private JTextField tf2;
	private JButton btnChangeTab;

	public Tab(TabbedPaneDemo demo, String changeTabTitle) {
		this.demo = demo;
		this.tf1 = new JTextField(30);
		this.tf2 = new JTextField(30);
		this.btnChangeTab = new JButton(changeTabTitle);
		this.btnChangeTab.addActionListener(this.demo);

		this.add(this.tf1);
		this.add(this.tf2);
		this.add(this.btnChangeTab);

		this.addComponentListener(new ComponentAdapter() {

			@Override
			public void componentShown(ComponentEvent e) {
				getTf2().requestFocusInWindow();
			}
		});
	}

	public JTextField getTf2() {
		return tf2;
	}

	public JButton getBtnChangeTab() {
		return btnChangeTab;
	}
}

Wenn das nicht hilft wäre ein KSKB sinnvoll.


Gruß
 

Olli_M

Mitglied
Guten Morgen,

vielen Dank, das war genau das, was ich gesucht hatte. :applaus:
Über den ComponentListener funktioniert das Ganze zuverlässig.

Nun gibt es 3 Events: focusGained, focusLost (der Button holt sich den Focus wieder, aber...),
focusGained (nun holt sich das Eingabefeld den Focus ein zweites Mal...)

setSelectedComponent(HauptseitePanel) +
requestFocusInWindow in dem ActionListener des Buttons funktioniert nur "unter günstigen Umständen"

schönen Tag noch

Olli
 

Olli_M

Mitglied
Danke, das war genau das, was ich gesucht hab. :)

(Irgendwie hab ich anscheinend ein Problem mit der Forumssoftware. Ich hab hier schon eine Antwort geschrieben und gepostet,
und nun sehe ich sie wieder nicht.)

freundliche Grüße

Olli
 

Neue Themen


Oben