ComboBox(editable) - Text verändern

beastofchaos

Bekanntes Mitglied
Hallo Leute, ich arbeite seit längerer Zeit an einem Zeichenprogramm. Nun gibt es in einer Leiste eine ComboBox mit der die Stiftweite eingestellt werden kann. Aus gewissen Gründen, möchte ich, dass man nur maximal 500 einstellen kann. Das soll so aussehen, dass man z.B. 600 eingibt und er per FocusLost o.ä.* das ausliest und den Text auf 500 setzt. Hier mal nötiger Quelltext:

Java:
    private JComboBox comboWidth = new JComboBox();
...
        String[] choosable = {"1", "2", "3", "4", "5", "7", "10", "15", "30", "50", "75", "100"};
        comboWidth = new JComboBox(choosable);
        comboWidth.setEditable(true);
        ((JTextField)comboWidth.getEditor().getEditorComponent()).setColumns(2);
        comboWidth.addActionListener(this); 
        tempPanel.add(comboWidth);

In ActionPerformed() steht:
Java:
        else if (evt.getSource() == comboWidth) {
    		try {
    			int test = Integer.parseInt(comboWidth.getSelectedItem().toString());
    			main.paintPanel.penWidth = (test > 500) ? 500 : test;
    			((JTextField)comboWidth.getEditor().getEditorComponent()).setText(test+"");
    		}
    		catch (NumberFormatException exc) {
    			main.paintPanel.penWidth = 1;
    		}
    	}


Leider funktioniert dieses "setText()"(in Zeile 5) nicht - soll heißen, dass
ich im Debugger zwar 2 Variablen mit dem Wert "600" gefunden habe, aber die sich kein bisschen ändern.
Ich konnt sie finden unter "comboWidth-Editor-Editor-oldValue='600'" und "comboWidth.selectedItemReminder='600'"...


*Ich würde ja gerne so eine Art "OnChange"-Eregniss für den Text benutzen, aber den TextListener gibt es leider nicht für die ComboBox bzw. deren Textfield-Komponente gibt - jemand eine Idee? 🙂

Gruß, Thomas
 
In Zeile 3 wird der Wert ja der Variable zugewiesen.
Diese Variable übergibst du in der Zeile 5 im setTest().

Die Prüfung und Begrenzung in der Zeile 4 hat aber auf diese Variable keinen Einfluss.
 
<-- zu klug, um Leichtsinnigkeitsfehler zu sehen xD sorry^^

Da wäre aber immer noch das zweite Problem, dass es keine Art "TextListener" gibt. Im Moment kann man nur die Eingabe speichern, indem man "Enter" drückt oder etwas anderes anklickt...
 
Hi,

habe hier mittels eines KeyListeners eine Abfrage auf die Eingabe in der ComboBox gelegt.
Hoffe das kann dir schon mal weiterhelfen...
Wenn du fragen dazu hast, dann nur raus damit.

Hier der Code der Klasse:

Java:
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JComboBox;
import javax.swing.JFrame;

public class ComboValueChange extends JFrame implements KeyListener {

	JComboBox cBox;
	String eingabe = "";
	int value = 0;

	public ComboValueChange() {
		initGui();
		setVisible(true);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		pack();
	}

	public void initGui() {
		String[] choosable = { "1", "2", "3", "4", "5", "7", "10", "15", "30",
				"50", "75", "100" };
		cBox = new JComboBox(choosable);
		cBox.setEditable(true);
		cBox.getEditor().getEditorComponent().addKeyListener(this);
		eingabe = cBox.getSelectedItem().toString();
		add(cBox);
	}

	@Override
	public void keyPressed(KeyEvent arg0) {
		// TODO Auto-generated method stub
		if (!eingabe.equals("") && arg0.getKeyCode() == KeyEvent.VK_BACK_SPACE) {
			eingabe = eingabe.substring(0, eingabe.length() - 1);
		} else if (eingabe.equals("")
				&& arg0.getKeyCode() == KeyEvent.VK_BACK_SPACE) {
			// mache nichts, da das Textfeld nicht leerer werden kann...
		} else {
			char c = arg0.getKeyChar();
			eingabe += c;
			value = Integer.parseInt(eingabe);

			if (value > 500) {
				eingabe = "500";
				cBox.getEditor().setItem(eingabe.substring(0, 2));
			}
		}

	}

	@Override
	public void keyReleased(KeyEvent arg0) {
		// TODO Auto-generated method stub
	}

	@Override
	public void keyTyped(KeyEvent arg0) {
		// TODO Auto-generated method stub
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new ComboValueChange();
	}
	
}

Grüße
 
Ah, du hast einen Listener gemacht, der sich auf das Frame bezieht. Das heißt, dass er imemr, egal welches Feld den Focus hat, er da die Veränderungen macht, oder? Kann man sicher abfragen, indem man fragt, was den Focus hat, aber vll. könnte ich dann auch gleich so einen TextListener benutzen, weild er funktioniert schlielich auch für ein Frame, bloß gibts denn nicht speziell für eine ComboBox...
 
Du verstehst da glaube ich was falsch...

Listener sind Interfaces die du entweder mittels einem "implements" der Klasse hinzufügst oder du nutzt anonyme Klassen/Interfaces also quasi so:

Java:
deineKomponente.addKeyListener(new KeyListener() {
			
			@Override
			public void keyTyped(KeyEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void keyReleased(KeyEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void keyPressed(KeyEvent e) {
				// TODO Auto-generated method stub
				
			}
		});

Der Listener, egal ob der anonym oder nicht ist, reagiert nur auf die Komponente auf die du den Listener auch "angemeldet" hast.
Also sprich: Du hast ein komponente.addIrgendEinListener(); verwendet... Dann reagiert auch NUR die komponente auf irgendwas.
 
Zuletzt bearbeitet:
Ich kenn mich mit Listener aus, aber er hat das doch zum JFrame implementiert, bezieht sich das nicht dnan auf das JFrame als Komponente...

oh, das wäre der Fall, wenn man noch
Code:
addKeyListener(this);
schreiben würde - sorry 😉
 
Richtig... mit addIrgendEinListener(this) würdest du den KeyListener auf den Frame legen, aber in meinem Code verwende ich ja combobox.addKeyListener(this) und damit reagiert auch nur die combobox darauf...
 

Zurück
Oben