Avatar billede mungojerrie Nybegynder
05. november 2004 - 08:56 Der er 1 løsning

problemer med KeyListener(VK_ENTER) sammen med textarea

Hej

Jeg har lavet en super klasse som implementerer en keylistener og den virker for så vidt fint. Mit problem opstår når jeg laver en sub klasse af min superklasse, som indeholder et tekstareafelt og når jeg trykker på <enter> inde i feltet reagerer listeneren jo også på det og det er jo lidt uheldigt, hvis man nu bare vil lave et linjeskift i sin tekstareafelt.
Ydermere synes jeg ikke altid at min subklasse bliver usynlig efter klik på enter tasten som jeg ellers har sat den til, men jeg har nok lavet en lille fejl. Min super klasse kommer her:


import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ContainerEvent;
import java.awt.event.ContainerListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ModalContainer extends JDialog implements ContainerListener, KeyListener{
   
    private JButton close;
    private JButton cancel;
   
    public ModalContainer(JFrame f, JComponent jc, String title) {
        this(f, jc, title, "OK", null);
    }
   
    public ModalContainer(JFrame f, JComponent jc, String title, String okStr, String cancelStr) {
        super(f, true);
        setResizable(false);
        setTitle(title);
       
        getContentPane().setLayout(new BorderLayout(0,0));
       
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
       
        JPanel buttonPane = new JPanel(new FlowLayout());
       
        close = new JButton(okStr);
        buttonPane.add(close);
        if (cancelStr != null) {
            cancel = new JButton(cancelStr);
            buttonPane.add(cancel);
        }
       
        getContentPane().add(buttonPane, BorderLayout.SOUTH);
       
        close.addActionListener (
                new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        if (okActivated())setVisible(false);
                    }
                }
        );
       
        if (cancelStr != null) {
            cancel.addActionListener (
                    new ActionListener() {
                        public void actionPerformed(ActionEvent e) {
                            if (cancelActivated())setVisible(false);
                        }
                    }
            );
        }
       
        if (jc != null) setComponent(jc);
       
        addKeyAndContainerListenerRecursively(this);
    }
   
    public boolean okActivated() { return true; }
    public boolean cancelActivated() { return true; }
   
    public void setComponent(JComponent jc) {
        getContentPane().add(jc, BorderLayout.CENTER);
        pack();
       
        Dimension size = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension dsize = getSize();
        setLocation((size.width - dsize.width)/2, (size.height - dsize.height)/2);
       
        setVisible(true);
    }
    private void addKeyAndContainerListenerRecursively(Component c)
    {
        c.removeKeyListener(this);
        c.addKeyListener(this);
       
        if(c instanceof Container){
            Container cont = (Container)c;
            cont.removeContainerListener(this);
            cont.addContainerListener(this);
            Component[] children = cont.getComponents();
            for(int i = 0; i < children.length; i++){
                addKeyAndContainerListenerRecursively(children[i]);
            }
        }
    }
   
    private void removeKeyAndContainerListenerRecursively(Component c) {
        c.removeKeyListener(this);
        if(c instanceof Container){
            Container cont = (Container)c;
            cont.removeContainerListener(this);
            Component[] children = cont.getComponents();
            for(int i = 0; i < children.length; i++){
                removeKeyAndContainerListenerRecursively(children[i]);
            }
        }
    }
   
    public void keyPressed(KeyEvent e) {
        int code = e.getKeyCode();
        if(code == KeyEvent.VK_ESCAPE){ cancelActivated(); }
        if(code == KeyEvent.VK_ENTER){ okActivated(); }
    }
    public void keyReleased(KeyEvent e) { }
    public void keyTyped(KeyEvent e) { } 
    public void componentAdded(ContainerEvent e) { addKeyAndContainerListenerRecursively(e.getChild()); }
    public void componentRemoved(ContainerEvent e) { removeKeyAndContainerListenerRecursively(e.getChild()); }
}

Min subklasse implementerer selvfølgelig også okActivated() og cancelActivated(), som bare returner true.
Avatar billede mungojerrie Nybegynder
05. november 2004 - 16:59 #1
lukker spg, da jeg fandt en bedre løsning:

benyt denne linje i contructor'en i stedet for
getRootPane().setDefaultButton(btnLukVindue);

Derfor ser klassen sådan ud:



import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ModalContainer extends JDialog {
   
    private JButton close;
    private JButton cancel;
   
    public ModalContainer(JFrame f, JComponent jc, String title) {
        this(f, jc, title, "OK", null);
    }
   
    public ModalContainer(JFrame f, JComponent jc, String title, String okStr, String cancelStr) {
        super(f, true);
        setResizable(false);
        setTitle(title);
        getContentPane().setLayout(new BorderLayout(0,0));
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        JPanel buttonPane = new JPanel(new FlowLayout());
        close = new JButton(okStr);
        buttonPane.add(close);
        if (cancelStr != null) {
            cancel = new JButton(cancelStr);
            buttonPane.add(cancel);
        }
        getContentPane().add(buttonPane, BorderLayout.SOUTH);
        close.addActionListener (
                new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        if (okActivated())setVisible(false);
                    }
                }
        );
        if (cancelStr != null) {
            cancel.addActionListener (
                    new ActionListener() {
                        public void actionPerformed(ActionEvent e) {
                            if (cancelActivated())setVisible(false);
                        }
                    }
            );
        }
        if (jc != null) setComponent(jc);
        getRootPane().setDefaultButton(close);
    }
   
    public void setComponent(JComponent jc) {
        getContentPane().add(jc, BorderLayout.CENTER);
        pack();
        Dimension size = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension dsize = getSize();
        setLocation((size.width - dsize.width)/2, (size.height - dsize.height)/2);
        setVisible(true);
    }
    public boolean okActivated() { return true; }
    public boolean cancelActivated() { return true; }
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester