frage zum keylistener



  • hallo !
    ich habe nun die oberfläche für einen einfachen texteditor fertig und möchte nun einen keylistener hinzufügen. dazu habe ich in die klasse GraphicComponent (von mir geschrieben) einen keylistener implementiert und im konstuctor von GraphicComponent die methode addKeyListener(this) aufgerufen. leider reagiert die component nicht wenn ich etwas auf der tastatur eintippe. ich poste mal die meiner meinung nach wichtigen stellen des quellcode.

    public class GraphicComponent extends JComponent implements KeyListener {
    
        //...hier steht code der für das problem nicht wichtig ist...
    
        public GraphicComponent() {
        addKeyListener(this);
        height = 400;
        width = 600;
        setPreferredSize(new Dimension(width,height));
        lengthOfLine = width;
        }
    
        //...hier steht code der für das problem nicht wichtig ist...
    
        public void keyTyped(KeyEvent e) {
        System.out.println(e.getKeyChar());
        }
    
        public void keyPressed(KeyEvent e) { /*hier kommt noch was rein*/ }
    
        public void keyReleased(KeyEvent e) { /*dito*/ }
        //...ende der klasse...
    

    so und hier die klasse CW die JFrame extended und GraphicComponent instanziert
    also das hießt GraphicComponent wird in der ContentPane von CW dargestellt:

    private void addGraphicComponent() {
        Container contentPane = getContentPane();
        gComponent =  new GraphicComponent();
        gComponent.setBackground(Color.white);
        scrollPane = new JScrollPane (gComponent);
            scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        contentPane.add( scrollPane, BorderLayout.CENTER);
        }
    

    über einen hinweis würde ich mich sehr freuen

    mfg
    tom



  • versuchs mal mit comp.setFocusable(true) oder in der Klasse die Methode boolean isFocusable() überschreiben und einfach true returnen



  • isFocusable()

    Heißt das nicht isFocusTraversable()? Oder ist das noch aus AWT-Zeiten?

    [Edit]OK, sorry. Ich habe in der APIDoc den entsprechenden Hinweis gefunden:
    public boolean isFocusTraversable()
    Deprecated. As of 1.4, replaced by isFocusable().[/Edit]

    [ Dieser Beitrag wurde am 05.07.2003 um 22:07 Uhr von destruct0r editiert. ]



  • hi !
    thx für die anworten. wo muss ich diese isFocusable() methode reinschreiben in GraphicComponent oder CW. ich hab mal folgendes ausprobiert: in GraphicComponent habe ich in den Constructor setFocusable(true) reingeschrieben. zusätzlich habe ich isFocusable() so überschrieben, dass diese immer true returned.das hat leider nicht funktioniert.
    dann habe ich versucht das auf die einzelenen komponenten zu übertragen in der CW klasse mit scrollPane.setFocusable(true) und contentPane.setFocusable(true) leider hat das auch nicht geholfen, dh es wurden keine zeichen auf der konsole ausgegeben wenn ich was eingetippt habe.(siehe quellcode weiter oben)

    mfg
    tom



  • was für ne Java-Version benutzt du denn? wenn's mit isFocusable überschreiben in GraphicComponent nicht geht, dann versuchs mal mit isFocusTraversable überschreiben (acht auch drauf, daß die Signatur genau übereinstimmt beim Überschreiben --

    public boolean isFocusTraversable()
    


  • hi crass !
    das funktioniert leider auch nicht. ich benutze java 1.4.2 also die aktuelleste version.hier ein auszug aus GraphicComponent:

    [code type="C++" tabs="4"]
    //... GraphicComponent class...
    public boolean isFocusTraversable() {
    return true;
    }

    //...hier stehen andere methoden...

    public void keyTyped(KeyEvent e) {
    System.out.println(e.getKeyChar());
    }

    /code]

    eigentlich müssten dann doch ein ausgabe in der bash erscheinen oder, was fehlt denn nun noch ??? muss ich in der klasse die GraphicComponnet instanziert auch einen keylistener hinzufügen ?

    mfg
    tom



  • hey crass!
    ich hab es doch noch hinbekommen und zwar mit folgenden zusätzlichen aufrufen der mehtoden setFocusable in der Klasse CW bezogen auf einelne komponenten:

    private void addGraphicComponent() {
        Container contentPane = getContentPane();
        gComponent =  new GraphicComponent();
        gComponent.setBackground(Color.white);
        scrollPane = new JScrollPane (gComponent);
    
            scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        contentPane.add( scrollPane, BorderLayout.CENTER);
        contentPane.addKeyListener(gComponent);
        contentPane.setFocusable(true);
        }
    

    mfg
    tom



  • eigentlich müßte es ausreichen, die Komponente selbst focusable zu machen, aber naja..wenns funktioniert 😉



  • habs mal ausprobiert: die Komponente muß noch den Focus requesten wenn mehrere Komponenten im Spiel sind.. mit graphicComponent.requestFocus() (kann man im MouseListener einbauen)

    [ Dieser Beitrag wurde am 06.07.2003 um 22:36 Uhr von crass editiert. ]


Anmelden zum Antworten