Textfeldeingaben, ohne im Textfeld zu sein

RealHAZZARD

Erfahrenes Mitglied
Servus.

Ich hab da mal ein Problem:
Ich befinde mich fokusmäßig auf der Jlist (und da möchte ich auch bleiben). Wenn ich jetzt eine Taste (Buchstabe oder Backspace) drücke, möchte ich das an das Textfeld weiterleiten. Ich dachte ich mache das mit meinTextfeld.dispatchEvent(meinKeyEvent). Aber das geht nicht. Es geht auch nicht wenn das Textfeld den Fokus hat.
Ich hab auch schonmal dem textfeld nen KeyListener spendiert, um da ab zu fangen, ob das event überhaupt am textfeld ankommt. Das Event kommt an!
Ich versteh es nicht!

Hier mein Ansatz:
Code:
import java.awt.BorderLayout;
import javax.swing.JPanel;
import javax.swing.JFrame;
import java.awt.GridBagLayout;
import javax.swing.JTextField;
import java.awt.Rectangle;
import javax.swing.JButton;
import javax.swing.JList;

public class Fenster extends JFrame {

    private static final long serialVersionUID = 1L;
    private JPanel jPanel = null;
    private JTextField jTextField1 = null;
    private JList jList = null;
    /**
     * This is the default constructor
     */
    public Fenster() {
        super();
        initialize();
    }

    /**
     * This method initializes this
     * 
     * @return void
     */
    private void initialize() {
        this.setSize(300, 200);
        this.setContentPane(getJPanel());
        this.setTitle("JFrame");
    }

    /**
     * This method initializes jPanel    
     *     
     * @return javax.swing.JPanel    
     */
    private JPanel getJPanel() {
        if (jPanel == null) {
            jPanel = new JPanel();
            jPanel.setLayout(null);
            jPanel.add(getJTextField1(), null);
            jPanel.add(getJList(), null);
        }
        return jPanel;
    }

    /**
     * This method initializes jTextField1    
     *     
     * @return javax.swing.JTextField    
     */
    private JTextField getJTextField1() {
        if (jTextField1 == null) {
            jTextField1 = new JTextField();
            jTextField1.setBounds(new Rectangle(14, 130, 264, 28));
            jTextField1.addKeyListener(new java.awt.event.KeyAdapter() {
                public void keyReleased(java.awt.event.KeyEvent ke) {
                    System.out.println(ke.getKeyChar()); 
                }
            });
        }
        return jTextField1;
    }

    /**
     * This method initializes jList    
     *     
     * @return javax.swing.JList    
     */
    private JList getJList() {
        if (jList == null) {
            jList = new JList();
            jList.setBounds(new Rectangle(12, 10, 263, 112));
            jList.addKeyListener(new java.awt.event.KeyAdapter() {
                public void keyReleased(java.awt.event.KeyEvent ke) {
                    getJTextField1().dispatchEvent(ke);
                    System.out.println("key dispached"); 
                }
            });
        }
        return jList;
    }

}

Ich hoffe Ihr könnt mir weierhelfen.
Danke. Schonmal
 
Zuletzt bearbeitet:
Hi

Also du sagst dem Textfeld ja auch nicht was es mit dem Event machen soll also es kann ja nicht wissen das du die "Eingabe" angezeigt bekommen möchtest.

Versuch es mal so. Hier wird halt jedes Zeichen einfach angehängt ( !auch Funktionstasten! ).

Code:
import java.awt.BorderLayout;
import javax.swing.JPanel;
import javax.swing.JFrame;
import java.awt.GridBagLayout;
import javax.swing.JTextField;
import java.awt.Rectangle;
import javax.swing.JButton;
import javax.swing.JList;

public class Fenster extends JFrame {

    private static final long serialVersionUID = 1L;
    private JPanel jPanel = null;
    private JTextField jTextField1 = null;
    private JList jList = null;
    /**
     * This is the default constructor
     */
    public Fenster() {
        super();
        initialize();
    }

    /**
     * This method initializes this
     * 
     * @return void
     */
    private void initialize() {
        this.setSize(300, 200);
        this.setContentPane(getJPanel());
        this.setTitle("JFrame");
    }

    /**
     * This method initializes jPanel    
     *     
     * @return javax.swing.JPanel    
     */
    private JPanel getJPanel() {
        if (jPanel == null) {
            jPanel = new JPanel();
            jPanel.setLayout(null);
            jPanel.add(getJTextField1(), null);
            jPanel.add(getJList(), null);
        }
        return jPanel;
    }

    /**
     * This method initializes jTextField1    
     *     
     * @return javax.swing.JTextField    
     */
    private JTextField getJTextField1() {
        if (jTextField1 == null) {
            jTextField1 = new JTextField();
            jTextField1.setBounds(new Rectangle(14, 130, 264, 28));
            jTextField1.addKeyListener(new java.awt.event.KeyAdapter() {
                public void keyReleased(java.awt.event.KeyEvent ke) {
                    System.out.println(ke.getKeyChar());
                    jTextField1.setText(jTextField1.getText() + ke.getKeyChar());
                }
            });
        }
        return jTextField1;
    }

    /**
     * This method initializes jList    
     *     
     * @return javax.swing.JList    
     */
    private JList getJList() {
        if (jList == null) {
            jList = new JList();
            jList.setBounds(new Rectangle(12, 10, 263, 112));
            jList.addKeyListener(new java.awt.event.KeyAdapter() {
                public void keyReleased(java.awt.event.KeyEvent ke) {
                    getJTextField1().dispatchEvent(ke);
                    System.out.println("key dispached"); 
                }
            });
        }
        return jList;
    }

}

Grüße
4men
 
Hallo.
Danke für die schnelle Antwort. Aber das hatte ich in einem früheren Lösungsansatzt auch schonmal versucht. Das ist aber nicht ganz was ich möchte. Ich möchte das Event einfach nur an das Textfeld weiterreichen, und das sollte dann die Reaktion zeigen, die es sonst beim direkten Event auch zeig.
Also du sagst dem Textfeld ja auch nicht was es mit dem Event machen soll also es kann ja nicht wissen das du die "Eingabe" angezeigt bekommen möchtest.
Ich hoffte eigentlich darauf, dass das Textfeld das tut, was es auch sonst immer tut, wenn das Event direkt stattgefunden hat (also zB. die direkte Eingabe in das Textfeld(da rafft das Textfeld es ja auch, dass es jetzt nen Buchstaben mehr darstellen, oder gar einen weglöschen soll)).
 
Hallo RealHazzard,

hast du es schon mal mit der Klasse Robot{} versucht? Dieser stellt Methoden bereit mit der du Maus- und Tastatur eingaben simulieren kannst.


Vg Erdal
 
Danke, aber das funz auch nicht:
Code:
...
private JList getJList() {
        if (jList == null) {
            jList = new JList();
            jList.setBounds(new Rectangle(12, 10, 263, 112));
            jList.addKeyListener(new java.awt.event.KeyAdapter() {
                public void keyReleased(java.awt.event.KeyEvent ke) {
                    getJTextField1().requestFocusInWindow();
                    getRobo().keyPress(ke.getKeyCode());
                    jList.requestFocusInWindow();
                    System.out.println("key pressed"); 
                }
            });
        }
        return jList;
    }
...

Nicht dass er einen Fehler bringt, nein. Er tut es einfach nur nicht!(!)
 
Hallo RealHazzard,

dein erster Ansatz war richtig aber nicht vollständig.

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

import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JTextField;

public class ListFieldExample extends JFrame {

	private JList list = new JList(new String[] { "SWT", "Swing", "AWT", "JMX",
			"Spring Framework", "JDOM" });

	private JTextField tField = new JTextField();

	public ListFieldExample() {
		this.setTitle(this.getClass().getCanonicalName());
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setAlwaysOnTop(true);
		this.setLocationByPlatform(true);

		this.add(list, BorderLayout.CENTER);
		this.add(tField, BorderLayout.SOUTH);

		list.addKeyListener(new KeyListener() {
			public void keyPressed(KeyEvent e) {
				tField.dispatchEvent(e);
			}

			public void keyReleased(KeyEvent e) {
				tField.dispatchEvent(e);
			}

			public void keyTyped(KeyEvent e) {
				tField.dispatchEvent(e);
			}

		});

		list.setSelectedIndex(0);

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

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


Vg Erdal
 
Danke. Habe es ausprobiert und es funktioniert. Aber kannst du mir zeigen welche Zeile es nun ist die dein Beispiel von meinem unterscheidet?
Ich kanns nicht finden.
THX
 
Gerne. Ich habe alle Methoden des Keylisteners implementiert. Nicht jede Taste wird von jeder Methode registriert, deswegen sollte man fall einem alle Tastatureingaben interessieren auch alle Methoden implementieren.


Vg Erdal
 
Ah ja. Tausend Dank.
Das Textfeld interessiert sich nur für die KeyTyped-Methode!
So kann ich dank dir beruhigt in das Wochenende starten.
Tschüss.
 
Hi

es ist die Methode keyTyped welche in dem speziellen Fall greift. Aber das ist ja nun nicht mehr nötig ... :-(

Gruß 4men

PS wollte die Lösung auch grad posten.:-)
 
Zurück