Swing-Komponenten an "Sichtbarkeits-Ebenenwechsel" hindern.

Kai008

Erfahrenes Mitglied
Geht das irgendwie?
Ich habe z. B. in einen Programm ein JTextField und darunter eine JComboBox, welche bei Eingaben aufklappt und eine Schnellauswahl bietet. Ab und zu passiert es aber, dass bei einer Änderung die JComboBox ober das JTextField schiebt.
Gibt es vielleicht eine Möglichkeit, dass zu unterbinden?
 
Moin,
Bei einer Änderung von WAS werden die Komponten WIE geschoben? Ich kann mir da nicht so viel drunter vorstellen. Ein kleines Codebeispiel wäre da vielleicht ganz hilfreich.

Viele Grüße
 
Ab und zu ändern Komponenten ihre Ebene, und ein Komponent, der sich hinter einen anderen befindet (siehe Anhang.)

Hier ist der komplette Source, ich denke die einzig relevante Methode ist die void run() (unterste Methode mit Inhalt im Body.)

Java:
package core.commandinputframe;

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

import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

import core.Command;
import core.Karen;

class TextField extends JTextField implements KeyListener, Runnable, DocumentListener
{
	private static final long serialVersionUID = 1L;
	
	private JComboBox fastSelectBox;
	private CommandInputFrame commandInputFrame;
	
	private boolean blockDocumentListener;
	private boolean breakThread;
	private Thread thread;
	private Karen karen;
	
	TextField(JComboBox fastSelectBox, CommandInputFrame commandInputFrame, Karen karen)
	{
		super();

		this.fastSelectBox = fastSelectBox;
		this.commandInputFrame = commandInputFrame;
		this.karen = karen;
		
		addKeyListener(this);
		getDocument().addDocumentListener(this);
	}
	public void keyPressed(KeyEvent arg0)
	{
		int keyCode = arg0.getKeyCode();
		if(arg0.getKeyCode() == KeyEvent.VK_ENTER)
			commandInputFrame.runCommand(getText());
		else if(arg0.getKeyCode() == KeyEvent.VK_ESCAPE)
			commandInputFrame.setVisible(false);
		else if(keyCode == KeyEvent.VK_DOWN)
		{
			if(fastSelectBox.getModel().getSize() - 1 > fastSelectBox.getSelectedIndex())
				fastSelectBox.setSelectedIndex(fastSelectBox.getSelectedIndex() + 1);
			String oldText = getText();
			blockDocumentListener = true;
			setText(fastSelectBox.getSelectedItem().toString());
			blockDocumentListener = false;
			select(getEqualCharCount(oldText, getText()), getText().length());
		}
		else if(keyCode == KeyEvent.VK_UP)
		{
			if(fastSelectBox.getSelectedIndex() > 0)
				fastSelectBox.setSelectedIndex(fastSelectBox.getSelectedIndex() - 1);
			String oldText = getText();
			blockDocumentListener = true;
			setText(fastSelectBox.getSelectedItem().toString());
			blockDocumentListener = false;
			select(getEqualCharCount(oldText, getText()), getText().length());
		}
	}
	private int getEqualCharCount(String s1, String s2)
	{
		int result = 0;
		char[] firstCharArray = s1.toCharArray();
		char[] secondCharArray = s2.toCharArray();
		
		for(int i = 0, size = Math.min(firstCharArray.length, secondCharArray.length); i < size; i++)
		{
			if(firstCharArray[i] == secondCharArray[i])
				result++;
			else
				break;
		}
		return(result);
	}
	
	public void insertUpdate(DocumentEvent e)
	{
		if(!blockDocumentListener)
			beginCollectionCommands();
	}
	private void beginCollectionCommands()
	{
		if(thread != null)
		{
			breakThread = true;
			
			try
			{
				thread.join();
			}
			catch (InterruptedException e) {}
		}
		breakThread = false;
		
		thread = new Thread(this);
		thread.start();
	}
	public void run()
	{
		String text = getText();
		int oldTextLenght = text.length();

		DefaultComboBoxModel model = new DefaultComboBoxModel();		
		for(int i = 0, size = karen.getCommandCount(); i < size && !breakThread; i++)
		{
			Command command = karen.getCommandPerListId(i);
			if(command.getData(Command.NAME).startsWith(text))
				model.addElement(command);
		}
		if(!breakThread)
		{
			fastSelectBox.setModel(model);
			if(model.getSize() > 0)
			{
				fastSelectBox.showPopup();
				Object selectedItem = fastSelectBox.getSelectedItem();
				blockDocumentListener = true;
				setText(selectedItem.toString());
				blockDocumentListener = false;
				select(oldTextLenght, selectedItem.toString().length());
			}
		}
	}
	
	public void keyReleased(KeyEvent arg0) {}
	public void keyTyped(KeyEvent arg0) {}
	
	public void changedUpdate(DocumentEvent e) {}
	public void removeUpdate(DocumentEvent e) {}
}
 

Anhänge

  • Neu Bitmap (3).PNG
    Neu Bitmap (3).PNG
    1,8 KB · Aufrufe: 22
Hi,
wenn ich das richtig sehe, willst du wohl eine Art AutoComplete Funktion erstellen. Eine Komponente über die andere zu legen ist dabei vielleicht kein so guter Ansatz. Hier bei dir sieht es so aus, als würde der Z-Index der Komponente neu gesetzt werden, wahrscheinlich über setComponentZOrder des Containers, und das müsste man abfangen. Führt dann aber vielleicht zu anderen unschönen Nebeneffekten.
Aber es gibt da auch schon gute fertige Lösungen. Schau dich mal bei SwingLabs http://swinglabs.org/ und da die Klasse ComboBoxAdapter http://swinglabs.org/hudson/job/Swi...ktop/swingx/autocomplete/ComboBoxAdaptor.html
das scheint das zu sein, was du brauchst...

Viele Grüße
 
Zurück