Hej NG!
Jeg sad og rodede lidt med JInternalFrame, og stødte i den sammenhæng
på et - for mig - uforklarligt fænomen: Der bliver kastet en focus
gained event efterfulgt af en focus lost event, når en JInternalFrame
bliver lukket op (de-iconified).
Hvorfor bliver disse events affyret? Ydermere, hvis jeg har 2
JInternalFrames på min JDesktopPane, bliver events'ne kun affyret,
hvis det er den lokationsmæssige nederste JInternalFrame der lukkes
op. Hvordan kan det være?
Jeg har tilføjet et lille testprogram, som I kan prøve.
Mvh Janus
------
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.beans.PropertyVetoException;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class Frame extends JFrame implements FocusListener {
private JDesktopPane desktop;
private InternalFrame intF1, intF2;
public static void main(String[] args) {
new Frame();
}
public Frame() {
super();
getContentPane().setLayout(new BorderLayout());
desktop = new JDesktopPane();
getContentPane().add("Center", desktop);
setBounds (10, 10, 800, 600);
setResizable(false);
intF1 = new InternalFrame("Internal 1");
desktop.add(intF1, new Integer(7));
intF2 = new InternalFrame("Internal 2");
desktop.add(intF2, new Integer(7));
try {
intF1.setIcon(true);
intF2.setIcon(true);
}
catch (PropertyVetoException pvExc) {
}
LayeredPanel lPanel = new LayeredPanel();
JPanel context = lPanel.getPanel();
JTextField field = new JTextField();
field.setPreferredSize(new Dimension(150, 30));
context.add(field);
field.addFocusListener(this);
desktop.add(lPanel, new Integer(5));
lPanel.setBounds(0, 0, 800, 600);
setVisible(true);
}
class LayeredPanel extends JLayeredPane {
private JPanel panel;
public LayeredPanel() {
super();
panel = new JPanel();
panel.setBounds(0, 0, 800, 600);
add(panel);
setLayer(panel, 0);
}
public JPanel getPanel() {
return panel;
}
}
class InternalFrame extends JInternalFrame {
public InternalFrame(String title) {
super(title, true, false, true, true);
JPanel panel = new JPanel(new BorderLayout());
JTextArea area = new JTextArea("Text Area");
area.setPreferredSize(new Dimension(300, 300));
panel.add(area, BorderLayout.CENTER);
getContentPane().add(panel);
pack();
setLocation(100, 100);
show();
}
}
public void focusGained(FocusEvent arg0) {
System.out.println("Focus gained: " + arg0.getComponent());
}
public void focusLost(FocusEvent arg0) {
System.out.println("Focus lost: " + arg0.getComponent());
}
}
|