Button无法找到Listener类

时间:2011-02-07 02:49:07

标签: java swing event-handling listener

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JPanel;

class Painter extends JPanel implements ActionListener{
private int x = 30, y = 30;
//remove the blocked comment to make it run
/*public Painter(){
    Buttons b = new Buttons(new String("Click to paint"));
    b.addActionListener(this);
    add(b);
}*/
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(new Color(44,55,66));
g.fillRect(200,200,x,y);
}
public void actionPerformed(ActionEvent e){
    x = 600;
    y = 600;
    repaint();
}
}
import javax.swing.JButton;


public class Buttons extends JButton{
public Buttons(String Tag){
    super(Tag);
    setBounds(20, 20, 150, 50);
    Painter p = new Painter();//comment it out
    addActionListener(p);//comment it out
}
}
import java.awt.Color;

import javax.swing.JFrame;


public class Window extends JFrame{
public Window(){
    Buttons b = new Buttons("Click Me");//comment it out
    Painter p = new Painter();
    getContentPane().add(b);//comment it out
    getContentPane().add(p);
    getContentPane().setBackground(Color.WHITE);
    setSize(700,700);
    setVisible(true);
    setResizable(false);
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
}

public class PaintOnEvent {
public static void main(String[] args){
    Window w = new Window();
}
}

这是一个测试程序。我使用Painter方法将addActionListener()类注册到Buttons类,那为什么它仍然无法查找actionperformed方法?然后当我在画家类中创建一个按钮时,它起作用了。为什么会这样?

1 个答案:

答案 0 :(得分:1)

您至少有两个Painter对象。显示的那个不是用作ActionListener对象的那个。例如,如果您将对正在显示的Painter对象的引用传递给您的Button类(更改由\ !!注释表示),该怎么办:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class Painter extends JPanel implements ActionListener {
    private int x = 30, y = 30;

    // remove the blocked comment to make it run
    /*
     * public Painter(){ Buttons b = new Buttons(new String("Click to paint"));
     * b.addActionListener(this); add(b); }
     */
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(new Color(44, 55, 66));
        g.fillRect(200, 200, x, y);
    }

    public void actionPerformed(ActionEvent e) {
        x = 600;
        y = 600;
        repaint();
    }
}

class Buttons extends JButton {
    public Buttons(String Tag, Painter p) {  \\!!
        super(Tag);
        setBounds(20, 20, 150, 50);
        // !! Painter p = new Painter();// comment it out
        addActionListener(p);// comment it out
    }
}

class Window extends JFrame {
    public Window() {
        Painter p = new Painter();// !!
        Buttons b = new Buttons("Click Me", p);// comment it out //!!
        getContentPane().add(b);// comment it out
        getContentPane().add(p);
        getContentPane().setBackground(Color.WHITE);
        setSize(700, 700);
        setVisible(true);
        setResizable(false);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }
}

public class PaintOnEvent {
    public static void main(String[] args) {
        Window w = new Window();
    }
}

考虑contentPane的BorderLayout的示例如下:

class Window extends JFrame {
    public Window() {
        Painter p = new Painter();
        Buttons b = new Buttons("Click Me", p); // !!
        b.setPreferredSize(new Dimension(150, 50));

        JPanel btnPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); // !!
        btnPanel.setOpaque(false); // !!
        btnPanel.add((b)); // !!
        p.setOpaque(false); // !!

        getContentPane().add(btnPanel, BorderLayout.NORTH); // !!
        getContentPane().add(p, BorderLayout.CENTER); // !!
        getContentPane().setBackground(Color.WHITE);
        ((JPanel) getContentPane()).setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); // !!
        // !! setSize(700, 700);
        setPreferredSize(new Dimension(700, 700)); // !!
        pack(); // !!
        setLocationRelativeTo(null); // !!
        setVisible(true);
        setResizable(false);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }
}