Simple Focus Listener in Java

27,337

In fact, there is no msgBox on your panel - it is just drawn over a panel, but from the structure's point of view, it does not exist at all. You need to add msgBox to the panel's children list, using standart JPanel's add method. Your myMessageBox class must inherit a JComponent from Swing, not Component from AWT, then your paintComponent method will override Swing's default and it will be invoked automatically from it's parent, Panel.

You must set your new component's size using setSize. Exact location of msgBox depends on your Panel's layout. It can be set explicitly with setLocation, if Panel's layout is null, or you may use one of more comfortable layouts.

As a side note, i recommend you to use some sort of a visual editor, such as an Eclipse's VE plugin.

See the followin working example:

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);
    }
Share:
27,337
Edwards
Author by

Edwards

(Java,Verilog Novice), (VBA Beginner)

Updated on July 16, 2022

Comments

  • Edwards
    Edwards almost 2 years

    I have created a simple application with a Panel(extended by JPanel) which contains a small box(myMessagePanel - see the code below).

    Basically, I want to generate focusevents from both the Panel and the box when the box is pressed. However, only focusGained and focusLost in the Panel is called. Here is the code:

    myMessageBox is the box, Panel is the panel and FocusListenerTest contains the main

    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);
    }
    }
    

    When I run this code, "Focus gained by box" is not printed when the myMessageBox is pressed.

    Thanks

    (PS: Didn't write comments as it is a simple application. Please let me know if comments are required)