problemer med KeyListener(VK_ENTER) sammen med textarea
HejJeg 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.
