2011-02-07 77 views
0
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(); 
} 
} 

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

回答

1

您至少有两个Painter对象。正在显示的人不是被用作ActionListener对象的人。举例来说,如果你传递给正在(通过\ !!评论的变化表示)显示给你的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(); 
    } 
} 

要综合考虑的BorderLayout的一个例子contentPane如下:

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

你是对的,它其实是两个画家的例子。但是,当我像你说的那样做时,按钮会频繁显示。是否因为按钮和面板分别添加到窗口中? – Gopal 2011-02-07 03:12:56