Кнопка не может найти класс Listener - PullRequest
0 голосов
/ 07 февраля 2011
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 в классе Buttons с помощью метода addActionListener(), тогда почему он все еще не может искать метод actionperformed?Затем, когда я создал кнопку в самом классе живописца, это сработало.Почему это так?

1 Ответ

1 голос
/ 07 февраля 2011

У вас есть как минимум два объекта Painter.Отображаемая не та, которая используется в качестве объекта ActionListener.Например, что если вы передадите ссылку на объект Painter, который отображается в вашем классе Button, примерно так (изменения обозначаются \ !! comments):

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