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
方法?然后当我在画家类中创建一个按钮时,它起作用了。为什么会这样?
答案 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);
}
}