Einfache Fokus-Listener in Java
Habe ich eine einfache Anwendung mit einem Fenster(erweitert JPanel), die enthält eine kleine box(myMessagePanel - siehe code unten).
Grundsätzlich möchte ich generieren focusevents sowohl das Panel und die box, wenn die box gedrückt wird. Allerdings nur focusGained und focuslost wurde in der Systemsteuerung aufgerufen wird. Hier ist der code:
myMessageBox ist die box -, Panel ist das panel und FocusListenerTest enthält die wichtigsten
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Panel extends JPanel implements MouseListener, FocusListener {
myMessageBox msgBox;
public Panel() {
addMouseListener(this);
addFocusListener(this);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
setBackground(Color.GREEN);
msgBox = new myMessageBox(g);
g.dispose();
}
public void focusGained(FocusEvent fe) {
System.out.println("Focus gained in JPanel");
}
public void focusLost(FocusEvent fe){
System.out.println("Focus lost in JPanel");
}
public void mousePressed(MouseEvent me) {
requestFocus();
System.out.println("Mouse Pressed in JPanel");
}
public void mouseReleased(MouseEvent me) {}
public void mouseClicked(MouseEvent me) {}
public void mouseEntered(MouseEvent me) {}
public void mouseExited(MouseEvent me) {}
}
class myMessageBox extends Component implements FocusListener, MouseListener{
myMessageBox(Graphics g) {
addMouseListener(this);
addFocusListener(this);
paintComponent(g);
System.out.println("Done");
}
public void paintComponent(Graphics g) {
g.fillRect(150,100,100,100);
}
public void mousePressed(MouseEvent me) {
requestFocus();
System.out.println("Mouse pressed on box");
}
public void mouseReleased(MouseEvent me) {}
public void mouseClicked(MouseEvent me) {}
public void mouseEntered(MouseEvent me) {}
public void mouseExited(MouseEvent me) {}
public void focusGained(FocusEvent fe){
System.out.println("Focus gained by box");
}
public void focusLost(FocusEvent fe) {
System.out.println("Focus lost by box");
}
}
public class FocusListenertest {
public static void main(String args[]) {
JFrame window = new JFrame();
Panel content = new Panel();
window.setContentPane(content);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setLocation(100,75);
window.setSize(400, 400);
window.setVisible(true);
}
}
Wenn ich diesen code ausführen, "Focus gained by box" wird nicht gedruckt, wenn die myMessageBox gedrückt wird.
Dank
(PS: nicht Kommentare schreiben, wie es ist eine einfache Anwendung. Bitte lassen Sie mich wissen, wenn Kommentare sind erforderlich)
msgBox
zu Panel
. Auch Keine Grenzen gesetzt, die für die Komponente.bitte lernen Sie die java Namenskonventionen halten
InformationsquelleAutor Edwards | 2011-03-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der Tat, es gibt keine
msgBox
auf Ihrem panel - es ist nur gezeichnet, über ein panel, sondern aus der Struktur Sicht, es existiert überhaupt nicht. Sie müssen hinzufügenmsgBox
auf die panel-Kinder-Liste, mit einem standart JPanel istadd
Methode. IhremyMessageBox
- Klasse Erben müssen eineJComponent
aus Swing, nichtComponent
von AWT, dann IhrepaintComponent
Methode überschreiben, den Swing-Standard und es wird automatisch aufgerufen, von Eltern,Panel
.Müssen Sie Ihre neue Komponente Größe mit
setSize
. Genaue Lage desmsgBox
hängt von IhremPanel
's layout. Es kann explizit festgelegt werden, mitsetLocation
, wennPanel
's layout istnull
, oder Sie können ein komfortabler layouts.Als seitliche Anmerkung, ich empfehle, Sie verwenden irgendeine Art von visuellen editor, wie eine Eclipse ist VE plugin.
Siehe das folgende Beispiel:
InformationsquelleAutor Alex Abdugafarov
Sollte diese Arbeit
InformationsquelleAutor MeBigFatGuy