Editorkomponente austaschen in JCombobox

derHarri

Grünschnabel
Hallo,

ist es möglich die Editorkomponente einer Combobox zur Laufzeit zu tauschen? Soll heissen, wenn eine Editierbare Combobox den Focus enrhällt soll eine andere Komponente als Editorkomponente verwendet werden als im nicht fokusierten zustand.
Folgenden Ansatz habe ich vergeblich versucht umzusetzen:
Ich habe eine Klasse welche ComboboxEditor implementiert (MyComboBoxEditor). in dieser klasse sind zwei Klassenvariablen. Ein Label und ein textfeld. Ausserdem habe ich die Klasse MyComboBoxEditor um ein zustandsflag focused erweitert. Zu testzwecken wird dieses Flag noch von "aussen" gesetzt. Die methode getEditorComponent() gibt je nach Zustand entweder das Label oder das textfeld zurück. Dargestellt wird allerdings immer nur die zuerst zurückgegebene Komponente.

Code:
class MyComboBoxEditor implements ComboBoxEditor{private DefaultNumericEntryField numericField = new DefaultNumericEntryField();

private JLabel aLabel = new JLabel();
 

boolean focused = false;

public void setFocused(boolean focused){this.focused = focused;



}
 

public boolean isFocused(){return this.focused;}
 
public Component getEditorComponent() {

Component theComponent = 

this.focused?this.numericField:this.aLabel;

System.out.println("Focusflag set? "+this.isFocused()+" EditorComponent = "+theComponent.getClass());return theComponent;}
 
 

public Object getItem() {return null;

}
 

public void selectAll() {}
 

public void setItem(Object anObject) {

this.setComponentsText(anObject.toString());}
 

private void setComponentsText(String aText){this.aLabel.setText("Label");

this.numericField.setText("0");
}
public void addActionListener(ActionListener l) {}
public void removeActionListener(ActionListener l) {}

}

Obwohl durch ändern der Rückgabewert der Methode get Methode getEditorComponent verändert wird, ändert sich die Komponente nicht. Als komponente wird das verwendet, was beim ersten Aufruf der Methode zurückgegeben wurde.



ich hoffe ich konnte mein Problem verständlich erleutern.


Vielen Dank für eure Hilfe
Harri E.
 
Hallo Harri,

schau mal hier:
Java:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;
import javax.swing.plaf.basic.BasicComboBoxEditor;
import javax.swing.text.DefaultFormatterFactory;
import javax.swing.text.NumberFormatter;

public class ComboChangeEditorExample extends JFrame implements ActionListener {

	private JLabel label = new JLabel("Textfeld:");

	private JComboBox comboBox = new JComboBox();

	private JButton button = new JButton("change");

	private ComboBoxEditor comboEditor = comboBox.getEditor();

	private NumberComboBoxEditor numberComboEditor = new NumberComboBoxEditor();

	private boolean hasChanged = true;

	public ComboChangeEditorExample() {
		this.setTitle(this.getClass().getSimpleName());
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setAlwaysOnTop(true);
		this.setLocationByPlatform(true);

		this.add(label, BorderLayout.NORTH);
		this.add(comboBox, BorderLayout.CENTER);
		this.add(button, BorderLayout.SOUTH);

		this.pack();
		this.setVisible(true);

		comboBox.setEditable(true);
		button.addActionListener(this);
	}

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

	public void actionPerformed(ActionEvent e) {
		if (hasChanged) {
			comboBox.setEditor((ComboBoxEditor) numberComboEditor);
			label.setText("Nummernfeld:");
		} else {
			comboBox.setEditor((ComboBoxEditor) comboEditor);
			label.setText("Textfeld:");
		}
		hasChanged = !hasChanged;
		comboBox.updateUI();
	}

	class JNumberField extends JFormattedTextField {
		public JNumberField() {
			NumberFormatter nfor = new NumberFormatter();
			nfor.setAllowsInvalid(false);
			DefaultFormatterFactory dff = new DefaultFormatterFactory(nfor);
			this.setFormatterFactory(dff);
		}
	}

	class NumberComboBoxEditor extends BasicComboBoxEditor {
		private JNumberField numberField = new JNumberField();

		public Component getEditorComponent() {
			return numberField;
		}
	}
}


Vg Erdal
 
Zurück