[英]Simple Focus Listener in Java
我用Panel(由JPanel擴展)創建了一個簡單的應用程序,其中包含一個小盒子(myMessagePanel-請參見下面的代碼)。
基本上,當框被按下時,我想同時從面板和框生成焦點事件。 但是,僅調用Panel中的focusGained和focusLost。 這是代碼:
myMessageBox是方框,Panel是面板,而FocusListenerTest包含主要
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);
}
}
當我運行此代碼時,按下myMessageBox時不會打印“框獲得的焦點”。
謝謝
(PS:因為它是一個簡單的應用程序,所以沒有寫評論。如果需要評論,請告訴我)
實際上,面板上沒有msgBox
它只是在面板上繪制的,但是從結構的角度來看,它根本不存在。 您需要使用msgBox
JPanel的add
方法將msgBox
添加到面板的子級列表中。 您的myMessageBox
類必須從Swing繼承JComponent
,而不是從AWT繼承Component
,然后您的paintComponent
方法將覆蓋Swing的默認值,並將自動從其父級Panel
調用。
您必須使用setSize
設置新組件的大小。 msgBox
確切位置取決於Panel
的布局。 如果Panel
的布局為null
,則可以使用setLocation
進行顯式設置,或者可以使用更舒適的布局之一。
作為附帶說明,我建議您使用某種可視化編輯器,例如Eclipse的VE插件。
請參閱以下工作示例:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class SwingTestPanel extends JPanel implements MouseListener, FocusListener {
MyMessageBox msgBox = new MyMessageBox();
public SwingTestPanel(){
initialize();
addMouseListener(this);
addFocusListener(this);
}
private void initialize(){
this.setBackground(Color.GREEN);
this.setLayout(null);
this.setSize(new Dimension(446, 265));
this.add(msgBox);
}
@Override
public void focusGained(FocusEvent fe){
System.out.println("Focus gained in JPanel");
}
@Override
public void focusLost(FocusEvent fe){
System.out.println("Focus lost in JPanel");
}
@Override
public void mousePressed(MouseEvent me){
requestFocus();
System.out.println("Mouse Pressed in JPanel");
}
@Override
public void mouseReleased(MouseEvent me){}
@Override
public void mouseClicked(MouseEvent me){}
@Override
public void mouseEntered(MouseEvent me){}
@Override
public void mouseExited(MouseEvent me){}
static class MyMessageBox extends JComponent implements FocusListener, MouseListener {
MyMessageBox(){
initialize();
addMouseListener(this);
addFocusListener(this);
System.out.println("Done");
}
private void initialize(){
this.setName("msgBox");
this.setEnabled(true);
this.setSize(100, 100);
this.setLocation(new Point(150, 100));
}
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.black);
g.fillRect(0, 0, getWidth(), getHeight());
}
@Override
public void mousePressed(MouseEvent me){
requestFocus();
System.out.println("Mouse pressed on box");
}
@Override
public void mouseReleased(MouseEvent me){}
@Override
public void mouseClicked(MouseEvent me){}
@Override
public void mouseEntered(MouseEvent me){}
@Override
public void mouseExited(MouseEvent me){}
@Override
public void focusGained(FocusEvent fe){
System.out.println("Focus gained by box");
}
@Override
public void focusLost(FocusEvent fe){
System.out.println("Focus lost by box");
}
}
public static void main(String args[]){
JFrame window = new JFrame();
SwingTestPanel content = new SwingTestPanel();
window.setContentPane(content);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setLocation(100, 75);
window.setSize(400, 400);
window.setVisible(true);
}
這應該工作
class Panel extends JPanel implements MouseListener, FocusListener {
myMessageBox msgBox;
public Panel() {
addMouseListener(this);
addFocusListener(this);
msgBox = new myMessageBox();
setLayout(null);
add(msgBox);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
setBackground(Color.GREEN);
}
@Override
public void focusGained(FocusEvent fe) {
System.out.println("Focus gained in JPanel");
}
@Override
public void focusLost(FocusEvent fe) {
System.out.println("Focus lost in JPanel");
}
@Override
public void mousePressed(MouseEvent me) {
requestFocus();
System.out.println("Mouse Pressed in JPanel");
}
@Override
public void mouseReleased(MouseEvent me) {
}
@Override
public void mouseClicked(MouseEvent me) {
}
@Override
public void mouseEntered(MouseEvent me) {
}
@Override
public void mouseExited(MouseEvent me) {
}
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);
}
}
class myMessageBox extends JComponent implements FocusListener, MouseListener {
myMessageBox() {
addMouseListener(this);
addFocusListener(this);
System.out.println("Done");
setBounds(150, 100, 100, 100);
setVisible(true);
}
public void paintComponent(Graphics g) {
Rectangle r = getBounds();
Color saveColor = g.getColor();
try {
g.setColor(Color.BLACK);
g.fillRect(0, 0, r.width, r.height);
} finally {
g.setColor(saveColor);
}
}
@Override
public void mousePressed(MouseEvent me) {
requestFocus();
System.out.println("Mouse pressed on box");
}
@Override
public void mouseReleased(MouseEvent me) {
}
@Override
public void mouseClicked(MouseEvent me) {
}
@Override
public void mouseEntered(MouseEvent me) {
}
@Override
public void mouseExited(MouseEvent me) {
}
@Override
public void focusGained(FocusEvent fe) {
System.out.println("Focus gained by box");
}
@Override
public void focusLost(FocusEvent fe) {
System.out.println("Focus lost by box");
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.