Kennt awt.list keine Tastatureingabe?

  • Themenstarter Themenstarter Phatdaro
  • Beginndatum Beginndatum
P

Phatdaro

Gast
Hallo zusammen.

Java:
private java.awt.List listWords = new java.awt.List(10);

//Der Liste werden mit listWords.add() Einträge übergeben

listWords.repaint();
listWords.setVisible(true);
listWords.requestFocus();
Ich habe in einem Programm eine awt.List, diese wird verwendet um dem Nutzer während er schreibt Wortvorschläge anzubieten.
Der Nutzer schreibt also und während dessen taucht diese Liste auf. Nun möchte ich aber, dass der Nutzer durch drücken der "Pfeil hoch" und "Pfeil runter" Tasten in dieser Liste navigieren kann.

Den Focus setzte ich schon auf die Liste, aber die Liste reagiert nicht auf Tastatureingaben ... ist das normal?
Muss ich mir das selektieren mit Tastatur da selbst reinprogrammieren?
 
Nein normal sollte das schon gehen. Was ich mich frage ist, wo tippt denn der Nutzer die Wörter ein? In ein Textfeld? Dann hat die Liste natürlich automatisch schon gar nicht mehr den Fokus! Eine kleine Demo wäre gut, so etwas in der Art (igitt awt ^^):
Java:
	public static void main(String[] args) throws Exception {
		Frame frame = new Frame();
		Panel panel = new Panel();
		java.awt.List listWords = new java.awt.List(10);
		listWords.add("hallo");
		listWords.add("welt");
		listWords.requestFocus();
		panel.add(listWords);
		frame.add(panel);
		frame.pack();
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
	}

😀
 
Hallo

ich werde meinen Code und die Funktion mal etwas genauer ausführen^^:

Man hat ein TextPane, in dem kann der Nutzer Code schreiben, bevor man den Code schreibt legt man Variablen in einem andren Fenster fest. Wenn man nun den Text schreibt kann man die ersten Buchstaben tippen, danach Strg+Leertaste (wie in NetBeans, VisualStudio usw.) und dann werden einem zu der Eingabe die passenden Variablen angezeigt:
http://i53.tinypic.com/2ln705g.png

Der Code sieht folgendermaßen aus:
Wenn der Nutzer im TextPane Ctrl+Leertaste drückt:

Java:
private void onKeyTyped(KeyEvent e){

        Pattern pwhiteSpaces = Pattern.compile("[\\W]");
        Matcher mwhiteSpaces = pwhiteSpaces.matcher(String.valueOf(e.getKeyChar()));

        //Leerzeichen wurde eingegeben
        if(mwhiteSpaces.matches()){
            if(e.isControlDown() && e.getKeyChar()==' '){
                firstCaretPositionChange = true;
                ctrlWhitespaceactive = true;                    
                processEnteredText(e.getKeyChar());
            }else if (...){
            ...
            }
            ...
}

Die Funktion processEnteredText(char enteredChar) verarbeitet nun die letzte Eingabe, erstellt aus der Eingabe die passende Liste und zeigt danach die awt.List an:

Java:
    private void processEnteredText(char enteredChar){
        boolean dontshow = false;
        listWords.setVisible(false);
        String enteredText = getEnteredText(enteredChar);  // Liefert die letzten eingegebenen Buchstaben zurück 

        //Es werden alle Variablen auf die eingegebenen Buchstaben geprüft und in die List listWords eingefügt
        //Wurden keine Wörter eingegeben werden alle Varablen angezeigt
        listWords.removeAll();
        HashMap allVar = m_SFT.getAllVariables();
        for (Iterator iterator = allVar.values().iterator(); iterator.hasNext();){
            Model_SFT_SCLVarDecl varDecl = (Model_SFT_SCLVarDecl) iterator.next();
            String varName = varDecl.getIdentifier();
            if(varName.startsWith(enteredText) && !enteredText.isEmpty())
                listWords.add(varName);
            else if (enteredText.isEmpty())
                listWords.add(varName);
        }

        if(listWords.getItemCount()>0){
            //Liste wird sortiert
            String[] araylist = listWords.getItems();
            Arrays.sort(araylist);
            listWords.removeAll();
            for (int i = 0; i < araylist.length; i++)
                listWords.add(araylist[i]);

            //Größe, Hintergrund usw. der angezeigten Vorschlagliste werden festgelegt
            listWords.setSize(listWords.getPreferredSize());
            listWords.setBackground(SystemColor.menu);
            listWords.addMouseListener(ivjEventHandler);
            listWords.addKeyListener(ivjEventHandler);

            // CaretPosition wird bestimmt/festgelegt
            if(firstCaretPositionChange)
                firstCaretPosition = ivjTextPaneCode.getCaret().getMagicCaretPosition();
            
            //Position der Auswahlliste wird bestimmt/festlegt
            //Sonderfälle würde die Vorschlagliste aus dem ivjTextPaneCode ragen wird sie bündig mit dem Rand angezeigt
            Point wordListPosition = new Point();
            if(firstCaretPosition.x + listWords.getWidth()> ivjTextPaneCode.getSize().width)
                wordListPosition.x = ivjTextPaneCode.getSize().width - listWords.getWidth();
            else
                wordListPosition.x = firstCaretPosition.x;

            if (firstCaretPosition.y+20 + listWords.getHeight()> ivjTextPaneCode.getSize().height)
                wordListPosition.y = ivjTextPaneCode.getSize().height - listWords.getHeight();
            else
                wordListPosition.y = firstCaretPosition.y+20;
            listWords.setLocation(wordListPosition);
            
            //Vorschlagliste wird angezeigt
            if(!dontshow){
                ivjTextPaneCode.add(listWords);
                listWords.repaint();
                listWords.setVisible(true);
                ivjTextPaneCode.repaint();
                listWords.requestFocus();
            }
        }
   }


Das Problem ist nun, dass der Fokus nicht mehr auf dem TextPane liegt, aber die Tastatureingaben wie "Pfeil hoch" und "Pfeil runter" keine Änderung an der awt.List hervorrufen ...

Kurz gesagt, soll das eigentlich die gleiche Funktion haben wie man es aus jeder aktuellen Entwicklungsumgebung kennt^^

Gruß
Chriss
 
Schau dir mal das an. Ist einen JTextField mit darunterliegender JComboBox zur Autovervollständigung. Hab ich im Feb. 2010 geschrieben, also alles andere als hübsch. 😳

Java:
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.getCommand(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) {}
}
 

Neue Themen


Zurück
Oben