Editable ComboBox / kein Weiterspringen

Status
Nicht offen für weitere Antworten.

Thomas Lorenz

Bekanntes Mitglied
Guten Morgen,

welche Einstellung muss ich treffen, damit folgendes wieder funktioniert:

Meine fünf ComboBoxes kann ich , wenn sie nicht auf "editable(true)" gesetzt sind, per Tab nacheinander anspringen. Sobald "editable(true)" gesetzt ist, geht dass nicht mehr.

Gruss Thomas
 

André Uhres

Top Contributor
Bei mir geht es ohne besondere Einstellung. Ich habe einfach nur editierbare JComboBoxen (jeweils mit DefaultComboBoxModel) in einen JFrame mit FlowLayout gesetzt. Daher denke ich, dass bei dir irgendwas Besonderes ist, wodurch es nicht geht. Darüber müsstest du uns dann wohl noch mehr erzählen, damit wir helfen können.
 

Thomas Lorenz

Bekanntes Mitglied
Dann werde ich mal ein paar Ausschnitte meiner GUI-Klasse zeigen:

Java:
public class MainFrame  extends JFrame  {
...

	JFrame Main = new JFrame();

        Vector<Component> order = new Vector<Component>();
	
	JLabel 		lb_artOfPatrol 				= new JLabel("Streifenart *)");	
	JComboBox 	cb_artOfPatrol 				= new JComboBox( );
	JLabel 		lb_operationOffice 			= new JLabel ("Einsatzdienststelle *)");
	JComboBox 	cb_operationOffice 			= new JComboBox();
	JLabel 		lb_Zivil 				        = new JLabel ("Zivilfahrzeuge:");
	JLabel 		lb_zivilTyp 				        = new JLabel ("Fz.typ (zivil)");
	JTextField	tf_zivilTyp 				                = new JTextField();
	JLabel 		lb_patrolArea 				= new JLabel ("Streifenbereich *)");
	JComboBox 	cb_patrolArea 				= new JComboBox();
	JLabel 		lb_licenceNumber 			= new JLabel ("amtl. Kennzeichen. *)");
	JTextField	tf_licenceNumber 			= new JTextField();
	JLabel 		lb_zivilColor 				= new JLabel ("Fz.farbe (zivil)");
	JTextField	tf_zivilColor 				= new JTextField();
	JLabel 		lb_patrolIdentification			= new JLabel ("Streifenbezeichnung *)");
	JComboBox 	cb_patrolIdentification			= new JComboBox();
	JLabel 		lb_date 				= new JLabel ("Einsatzdatum *)");
	JTextField 	tf_date 				= new JTextField();
	JCheckBox 	ch_nightService 			= new JCheckBox("Nacht");
	JButton		bt_calender				= new JButton("Kalender");


...

public MainFrame(SystemData sys, ErrorHelper error, PropertyData data, ReportData report, ArrayList<ReportData> lists, 
			CollectionController controller, CheckFiles files) 
	{
..


		// Festlegen der Reihenfolge, in der die Komponenten angesprungen werden
		
		order.add(cb_artOfPatrol);
		order.add(cb_operationOffice);
		order.add(cb_patrolArea);
		order.add(cb_patrolIdentification);
		order.add(tf_licenceNumber);
		order.add(ch_nightService);
		order.add(bt_calender);

public Container addComponentsToPane(){
..
Container pane = getContentPane();
	    	 {
	    	    	
	    	    	/* Das Hauptfenster wird mit einem Panel belegt, welches 
	    	    	 * wiederum in mehrere einzelne Panels unterteilt ist.
	    	    	 * Auch diese Panels sind ihrerseits mit weiteren Panels
	    	    	 * verschachtelt.
	    	    	 * 
	    	    	 * 1. Einteilung
	    	    	 * Das Hauptfenster (tp_main) wird in zwei Bereiche eingeteilt:
	    	    	 *  	1. Bereich : TabbedPane (pan_tabbed1)
	    	    	 *  	2. Bereich : (pan_2) Liste für schriftliche Arbeiten, Liste für Einsätze, weitere Navigation (z.B. Buttons) 
	    	    	 * 
	    	    	 */ 

..

 /* zur pan_tabbed1 :
	    	    	 * 
	    	    	 *	1. Unterteilung : Die erste Ansicht der TabbedPane (pan_tabbed11) enthält z.B. Streifenart, Einsatzdienststelle, Streifenbereich
	    	    	 *	2. Unterteilung : Die 2.Ansicht (pan_tabbed12) enthält das Einsatzdatum, Nachtdienst, amtl. Kennzeichen
	    	    	 *
	    	    	 */
	    	       
	    	                
	    	        pan_tabbed1.setLayout(new GridLayout (1,3));
	    	        pan_tabbed1.setBorder(new EmptyBorder(35,25,0,80)); 
	    	        pan_tabbed1.setBackground(_Sys.getBackground());
	    	        
	    	        // 1. Unterpanel
	    	        JPanel pan_tabbed11 = new JPanel();
	    	        pan_tabbed11.setLayout(new GridLayout(4,2));
	    	        pan_tabbed11.setBorder(new EmptyBorder(20,25,230,190)); 
	    	        
	    	        pan_tabbed11.add(lb_artOfPatrol);
	    	        cb_artOfPatrol.addFocusListener(new FocusListener(){

			    public void focusGained(FocusEvent e) {
				// TODO Auto-generated method stub
				
			    }

			    public void focusLost(FocusEvent e) {
				i = 100;
				
			    }
	    	            
	    	        });
	    	        pan_tabbed11.add(cb_artOfPatrol);
	    	        pan_tabbed11.add(lb_operationOffice);
	    	        pan_tabbed11.add(cb_operationOffice);
	    	        cb_operationOffice.setEditable(true);
	    	       
	    	        pan_tabbed11.add(lb_patrolArea);
	    	        cb_patrolArea.setEditable(true);
	    	        pan_tabbed11.add(cb_patrolArea);
	    	        
	    	        pan_tabbed1.add(pan_tabbed11);
	    	        
	    	        // 2.Unterpanel
	    	        JPanel pan_tabbed12 = new JPanel();
	    	        pan_tabbed12.setLayout(new GridLayout(4,2));
	    	        pan_tabbed12.setBorder(new EmptyBorder(20,25,230,190)); 
	    	        
	    	        pan_tabbed12.add(lb_patrolIdentification);
	    	        cb_patrolIdentification.setEditable(true);
	    	        pan_tabbed12.add(cb_patrolIdentification);
	    	        pan_tabbed12.add(lb_licenceNumber);
	    	        pan_tabbed12.add(tf_licenceNumber);


Also genau gesagt läuft es so, dass die erste ComboBox (Streifenart) den ersten Focus auf der TabbedPane bekommt. Anschließend springt der Focus zur CB (Einsatzdienststelle) die ihrerseits editierbar ist.
Von dort aus geht es nicht zur dritten CB (Streifenbereich), sondern zurück zur ersten.
Und das, obwohl ich im mit dem Vector 'order' die Reihenfolge ( 1, 2, 3 ... ) festgelegt habe.

Ich hoffe, dass dieser Codesnip ausreichend ist.

Thomas
 

André Uhres

Top Contributor
Wahrscheinlich fehlt immer noch der entscheidende Teil, denn dein Code funktioniert soweit bei mir:
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import javax.swing.border.*;

public class MainFrame extends JFrame {

    private Vector<Component> order = new Vector<Component>();
    private JLabel lb_artOfPatrol = new JLabel("Streifenart *)");
    private JComboBox cb_artOfPatrol = new JComboBox();
    private JLabel lb_operationOffice = new JLabel("Einsatzdienststelle *)");
    private JComboBox cb_operationOffice = new JComboBox();
    private JLabel lb_patrolArea = new JLabel("Streifenbereich *)");
    private JComboBox cb_patrolArea = new JComboBox();
    private JLabel lb_licenceNumber = new JLabel("amtl. Kennzeichen. *)");
    private JTextField tf_licenceNumber = new JTextField();
    private JLabel lb_patrolIdentification = new JLabel("Streifenbezeichnung *)");
    private JComboBox cb_patrolIdentification = new JComboBox();
    private JCheckBox ch_nightService = new JCheckBox("Nacht");
    private JButton bt_calender = new JButton("Kalender");
    private JPanel pan_tabbed1 = new JPanel();

    public MainFrame() {
        super("MainFrame");
        setSize(1000, 600);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // Festlegen der Reihenfolge, in der die Komponenten angesprungen werden
        order.add(cb_artOfPatrol);
        order.add(cb_operationOffice);
        order.add(cb_patrolArea);
        order.add(cb_patrolIdentification);
        order.add(tf_licenceNumber);
        order.add(ch_nightService);
        order.add(bt_calender);
        add(addComponentsToPane());
    }

    private Container addComponentsToPane() {
        pan_tabbed1.setLayout(new GridLayout(1, 3));
        pan_tabbed1.setBorder(new EmptyBorder(35, 25, 0, 80));
        // 1. Unterpanel
        JPanel pan_tabbed11 = new JPanel();
        pan_tabbed11.setLayout(new GridLayout(4, 2));
        pan_tabbed11.setBorder(new EmptyBorder(20, 25, 230, 190));
        pan_tabbed11.add(lb_artOfPatrol);
        cb_artOfPatrol.addFocusListener(new FocusListener() {

            public void focusGained(FocusEvent e) {
            }

            public void focusLost(FocusEvent e) {
            }
        });
        pan_tabbed11.add(cb_artOfPatrol);
        pan_tabbed11.add(lb_operationOffice);
        pan_tabbed11.add(cb_operationOffice);
        cb_operationOffice.setEditable(true);
        pan_tabbed11.add(lb_patrolArea);
        cb_patrolArea.setEditable(true);
        pan_tabbed11.add(cb_patrolArea);
        pan_tabbed1.add(pan_tabbed11);
        // 2.Unterpanel
        JPanel pan_tabbed12 = new JPanel();
        pan_tabbed12.setLayout(new GridLayout(4, 2));
        pan_tabbed12.setBorder(new EmptyBorder(20, 25, 230, 190));
        pan_tabbed12.add(lb_patrolIdentification);
        cb_patrolIdentification.setEditable(true);
        pan_tabbed12.add(cb_patrolIdentification);
        pan_tabbed12.add(lb_licenceNumber);
        pan_tabbed12.add(tf_licenceNumber);
        pan_tabbed1.add(pan_tabbed12);
        return pan_tabbed1;
    }

    public static void main(final String[] args) {
        Runnable gui = new Runnable() {

            @Override
            public void run() {
                new MainFrame().setVisible(true);
            }
        };
        //GUI must start on EventDispatchThread:
        SwingUtilities.invokeLater(gui);
    }
}
 
Zuletzt bearbeitet:

André Uhres

Top Contributor
Deine FocusTraversalPolicy scheint die editierbaren JComboBox Instanzen nicht zu erkennen. Versuch mal in getComponentAfter und getComponentBefore sowas zu machen:
Java:
if(component.getParent() instanceof JComboBox){
    component = component.getParent();
}
 

Ebenius

Top Contributor
Würdest Du sagen, dass es ich hier um einen Bug seitens JAVA handelt?
Nein. Es ist ein (anderer) Fehler in Deiner FocusTraversalPolicy. Eine nicht editierbare JComboBox ist focusable. Eine editierbare JComboBox ist aber nicht focusable. Das klingt seltsam, ist aber richtig, denn eine editierbare JComboBox hat einen Editor der focusable ist, eine nicht editierbare JComboBox bekommt den Focus aber selbst. Deine FocusTraversalPolicy muss Component.isFocusable() abfragen und darf nicht einfach jede Komponente fokussieren. Dort liegt der Fehler.

Teste das ganze ruhig mal mit anderen Komponenten die ebenfalls nicht fokussierbar sind. Beachtet Deine Policy auch FocusCycleRoots ordentlich? Fokus ist tatsächlich ein nicht allzu einfaches Thema.

Ebenius
 

André Uhres

Top Contributor
Andre, das war SUUUUPER!

Würdest Du sagen, dass es ich hier um einen Bug seitens JAVA handelt?

Thomas

Höchstwahrscheinlich ist das fragliche Verhalten den Javaentwicklern bekannt und wird von ihnen nicht unbedingt als Bug angesehen. Wenn das seltsame Verhalten nicht dokumentiert ist, würde ich es aber eher als Bug bezeichnen, oder zumindest als verbesserungswürdiges Verhalten ("isFocusable" abzufragen bringt imho auch nix, da normalerweise sowohl Box als auch Textfeld fokusierbar sind).
 

Ebenius

Top Contributor
da normalerweise sowohl Box als auch Textfeld fokusierbar sind).
Entschuldigung. Natürlich habe ich meine Behauptung oben vorher geprüft, allerdings nicht ganz korrekt... Das ComboBoxUI stellt eine Methode zur Verfügung, die [c]isFocusTraversable(JComboBox)[/c] heißt. Ich nahm an, dass JComboBox's (von Component geerbte) [c]isFocusTraversable()[/c]-Methode darauf umleitet. Falsche Annahme. :-(

In BasicComboBoxUI ist diese Methode so dokumentiert:
API-Doc hat gesagt.:
Determines if the JComboBox is focus traversable. If the JComboBox is editable this returns false, otherwise it returns true.


Die [c]LayoutFocusTraversalPolicy[/c] wiederrum, kennt zwei spezielle Komponenten: [java=212] } else if (aComponent instanceof JTable) {
// JTable only has ancestor focus bindings, we thus force it
// to be focusable by returning true here.
return true;
} else if (aComponent instanceof JComboBox) {
JComboBox box = (JComboBox)aComponent;
return box.getUI().isFocusTraversable(box);
[/code]
Also würde ich die beiden Fälle ebenfalls, genauso beachten. Und damit halte ich das auch für einen Bug. :-/

Ebenius
 

n4wuko

Neues Mitglied
Hallo Leutz, tud mir leid, wenn ich diesen Thread wieder ausgrabe, jedoch habe ich das selbe Problem und hab schon viel versucht.
Nun wenn man in meinem Panel bei der editable JComboBox ankommt und dann weiter zur nächsten Comp tabbt, springt er an den Anfang zurück. Ist dies verhalten immer so?

Habe eine eigene FocusTraversalPolicy geschrieben und komme bei dem Problem einfach nicht weiter, u.a. tritt das selbe Problem auch bei dem JXDatePicker auf. Wie habt ihr das gelöst?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T JavaFX Editable Combobox Text-Selektierung nach Trigger AWT, Swing, JavaFX & SWT 4
W MouseListener im editable ComboBox AWT, Swing, JavaFX & SWT 14
B Editable autocomplete Combobox, Swing AWT, Swing, JavaFX & SWT 2
M JavaFX TableView nur erste Zeile editable machen und gelb markieren AWT, Swing, JavaFX & SWT 0
P Checkboxes in JTable nicht editable AWT, Swing, JavaFX & SWT 9
U Swing Jtable cells value editable AWT, Swing, JavaFX & SWT 1
A editable JTextField & setText AWT, Swing, JavaFX & SWT 2
0 JTextPane copy/paste trotz editable(false) ? AWT, Swing, JavaFX & SWT 10
T Swing JComboBox editable Zeicheneingabe begrenzen AWT, Swing, JavaFX & SWT 4
A Swing JTree Editable einzelne Nodes editierbar machen! AWT, Swing, JavaFX & SWT 2
S Swing editable JCombobox mit eigenen Einträgen manangen AWT, Swing, JavaFX & SWT 5
D JCombox editable true AWT, Swing, JavaFX & SWT 5
P JTable not editable AWT, Swing, JavaFX & SWT 4
R wert aus editable JComboBox holen AWT, Swing, JavaFX & SWT 2
W Element aus comboBox mit observableList löschen AWT, Swing, JavaFX & SWT 3
T Combobox mit Autocomplete-Funktion AWT, Swing, JavaFX & SWT 7
J Eingaben aus Textfield & ComboBox speichern und in ComboBox wieder ausgeben AWT, Swing, JavaFX & SWT 3
N Promt Text der Combobox AWT, Swing, JavaFX & SWT 0
Doppel JavaFX ComboBox AWT, Swing, JavaFX & SWT 5
P JavaFX ClassCastException bei ComboBox.getValue AWT, Swing, JavaFX & SWT 4
F Wie bekomme ich den Wert der ComboBox in eine Variable gespeichert welche ich für meinen ActionListener nutzen kann? AWT, Swing, JavaFX & SWT 3
M Swing Java Swing/AWT Combobox Bug AWT, Swing, JavaFX & SWT 3
M Combobox bild anklicken AWT, Swing, JavaFX & SWT 2
L JavaFX Wiederspenstige ComboBox AWT, Swing, JavaFX & SWT 0
P Combobox und Enum AWT, Swing, JavaFX & SWT 3
L ComboBox Wert automatisch auswählen AWT, Swing, JavaFX & SWT 6
L Methode zum Füllen einer ComboBox AWT, Swing, JavaFX & SWT 4
K Nullpointer Combobox Listener AWT, Swing, JavaFX & SWT 2
K JavaFX Combobox, Textfield & setOnMouseClicked AWT, Swing, JavaFX & SWT 2
it_is_all Swing Button, ComboBox,... -- Unterschied: NetBeans Design <-> Ausführung AWT, Swing, JavaFX & SWT 2
D JavaFX ComboBox String setzen AWT, Swing, JavaFX & SWT 20
offi Combobox in TableCell AWT, Swing, JavaFX & SWT 1
D Javafx Combobox Abfrage aus mysql AWT, Swing, JavaFX & SWT 8
K Event Handling ComboBox Event Handler AWT, Swing, JavaFX & SWT 7
MrSnake ComboBox-Einträge werden unsichtbar AWT, Swing, JavaFX & SWT 0
L ComboBox: slider positionieren AWT, Swing, JavaFX & SWT 0
M JavaFX ComboBox: Update zur Laufzeit AWT, Swing, JavaFX & SWT 16
M JavaFX Combobox bindBidirectional AWT, Swing, JavaFX & SWT 4
D [Anfänger]ComboBox erstellt Einträge in einer anderen ComboBox AWT, Swing, JavaFX & SWT 3
H Combobox aktualisieren AWT, Swing, JavaFX & SWT 2
G Swing ComboBox: Auswahl eines Items der Liste durch Eingabe eines Buchstabens AWT, Swing, JavaFX & SWT 3
M JavaFX ComboBox AWT, Swing, JavaFX & SWT 5
T Problem: ComboBox und addItem AWT, Swing, JavaFX & SWT 5
J ComboBox als Filter benutzen AWT, Swing, JavaFX & SWT 1
M ausgewählte Inhalt von ListItem inn ComboBox in der Tabelle speichern AWT, Swing, JavaFX & SWT 0
Developer_X Java JTable - Combobox + Checkbox - Cellrenderer + Editor AWT, Swing, JavaFX & SWT 3
G Dynamische ComboBox AWT, Swing, JavaFX & SWT 3
U Combobox mit individuellen Texten AWT, Swing, JavaFX & SWT 5
M JavaFX Combobox - Item Auswahl mit Tasten AWT, Swing, JavaFX & SWT 8
F JavaFX Daten aus Tabelle in ComboBox AWT, Swing, JavaFX & SWT 9
C Beschriftungen von Tabellenspalten mit Combobox aussuchen AWT, Swing, JavaFX & SWT 2
G JavaFX ComboBox .getItems().add() Problem AWT, Swing, JavaFX & SWT 9
D Swing [Frage] ComboBox + Label AWT, Swing, JavaFX & SWT 3
F SWT Problem mit Tabelle und Combobox in einem Wizard AWT, Swing, JavaFX & SWT 5
B JAVAFX icon in ComboBox einfügen AWT, Swing, JavaFX & SWT 5
W Swing Combobox Abhängigkeit AWT, Swing, JavaFX & SWT 1
S ComboBox-Werte aus einem Array an Textfields übergeben AWT, Swing, JavaFX & SWT 3
A Swing GUI mit ComboBox, wenn Item ausgewählt wurde neues GUI AWT, Swing, JavaFX & SWT 7
S Combobox aktualisieren AWT, Swing, JavaFX & SWT 3
B Erstellen eigener Combobox ("CellFactory") AWT, Swing, JavaFX & SWT 4
C Swing ComboBox - ActionListener deaktivieren AWT, Swing, JavaFX & SWT 2
A combobox automatisch in ein textfeld wechseln AWT, Swing, JavaFX & SWT 3
J Swing Drive-ComboBox AWT, Swing, JavaFX & SWT 7
C TextFeld in Verbindung zur ComboBox automatisch aktualisieren AWT, Swing, JavaFX & SWT 7
L Swing Model für ComboBox AWT, Swing, JavaFX & SWT 14
H Combobox in einer einzelnen Zelle der Jtable AWT, Swing, JavaFX & SWT 2
T Java Combobox Problem AWT, Swing, JavaFX & SWT 3
C SWT Combobox mit Textdatei füllen AWT, Swing, JavaFX & SWT 2
M comboBox Listener? AWT, Swing, JavaFX & SWT 2
R Datenbanktabellen in Combobox AWT, Swing, JavaFX & SWT 3
C Combobox bei Tabellenänderung mit aktualisieren AWT, Swing, JavaFX & SWT 11
1 CellEditor mit ComboBox richtig beenden AWT, Swing, JavaFX & SWT 4
L SWT Actionlistener Combobox öffnen AWT, Swing, JavaFX & SWT 4
E Swing CellEditor mit Combobox durch Tastatureingabe editieren?! AWT, Swing, JavaFX & SWT 3
GianaSisters Swing ComboBox im jTable (in bestimmter Zelle nicht über die ganze Spalte) AWT, Swing, JavaFX & SWT 4
T Daten mittels ComboBox in ein JTable adden AWT, Swing, JavaFX & SWT 7
N Filternde Combobox in JTable verliert Fokus nach erster Eingabe AWT, Swing, JavaFX & SWT 2
F Wert zu Eintrag in ComboBox speichern?! AWT, Swing, JavaFX & SWT 7
P Swing ComboBox(en) in JTable auslesen und ausgeben AWT, Swing, JavaFX & SWT 11
M Index von Combobox AWT, Swing, JavaFX & SWT 20
L ComboBox in Action AWT, Swing, JavaFX & SWT 4
D ComboBox & CellListRenderer AWT, Swing, JavaFX & SWT 6
D ComboBox-Model mit Observer AWT, Swing, JavaFX & SWT 3
B Taschenrechner mit ComboBox AWT, Swing, JavaFX & SWT 7
T ComboBox auslesen AWT, Swing, JavaFX & SWT 11
P Combobox liesst falschen Wert AWT, Swing, JavaFX & SWT 10
C Combobox im JFrame aus Datenbank befüllen AWT, Swing, JavaFX & SWT 6
M Combobox soll Farbe einer Komponente setzen AWT, Swing, JavaFX & SWT 2
M Swing ComboBox ein SelectedItem übergeben/anzeigen AWT, Swing, JavaFX & SWT 7
J Werte aus Combobox speichern AWT, Swing, JavaFX & SWT 3
J Combobox als Filterkriterium (Gruppierung) in JTable AWT, Swing, JavaFX & SWT 7
R Swing ComboBox und doppelter Event!? AWT, Swing, JavaFX & SWT 10
M SWT Wie Textfeld hinzufügen, nach Auswahl von einem bestimmten Combobox-item? AWT, Swing, JavaFX & SWT 3
M SWT ComboBox mit DB-Inhalten Designfrage AWT, Swing, JavaFX & SWT 5
W Combobox mit eingabefeld AWT, Swing, JavaFX & SWT 7
M Combobox in JTable AWT, Swing, JavaFX & SWT 4
S Swing ComboBox aus Array befüllen AWT, Swing, JavaFX & SWT 2
K Per ComboBox Dateien einlesen AWT, Swing, JavaFX & SWT 23
0 Hintergundfarbe von editierbarer ComboBox ändern AWT, Swing, JavaFX & SWT 2
M Frage zu ComboBox AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen

Neue Themen


Oben