主要必须是抽象的,带有侦听器的ActionPerformed方法问题

时间:2019-05-19 10:45:35

标签: java jframe jbutton actionlistener

该程序只是为了自学Java。 在我周围编码时遇到了以下问题: 在我的Main类中实现的按钮上使用侦听器时出现错误(红色下划线)。

由于我是Java新手,因此如果解决方案显而易见,请原谅。我已经尝试将main方法和actionPerfomed方法抽象化,但这会导致进一步的问题。我还尝试了@Override方法之前的actionPerformed

代码如下:

// Java program to create a blank text
// field of definite number of columns.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Main extends JFrame implements ActionListener {
    // JTextField
    static JTextField t;

    // JFrame
    static JFrame f;

    // JButton
    static JButton b;

    // label to diaplay text
    static JLabel l;

    // default constructor
    Main()
    {
    }

    // main class
    public static void main(String[] args)
    {
        // create a new frame to stor text field and button
        f = new JFrame("textfield");

        // create a label to display text
        l = new JLabel("nothing entered");

        // create a new button
        b = new JButton("submit");

        // create a object of the text class
        Main te = new Main();

        // addActionListener to button
        b.addActionListener(te);

        // create a object of JTextField with 16 columns
        t = new JTextField(16);

        // create a panel to add buttons and textfield
        JPanel p = new JPanel();

        // add buttons and textfield to panel
        p.add(t);
        p.add(b);
        p.add(l);

        l.setOpaque(true);
        // add panel to frame
        f.add(p);

        // set the size of frame
        f.setSize(300, 300);

        p.setBackground(Color.cyan);

        f.show();
    }

    // if the button is pressed
    public void actionPerformed(java.awt.event.ActionEvent e, JPanel p)
    {
        String s = e.getActionCommand();
        if (s.equals("submit")) {
            // set the text of the label to the text of the field
            if(t.getText().equals("hue")) {

                p.setBackground(changeColor());
            }
            l.setText(t.getText());

            // set the text of field to blank
            t.setText(" ");
        }
    }
    public Color changeColor() {
        int r = (int)(Math.random())*256;
        int g = (int)(Math.random())*256;
        int b = (int)(Math.random())*256;
        Color color = new Color(r,g,b);
        return color;
    }
}

2 个答案:

答案 0 :(得分:0)

这里:

public void actionPerformed(java.awt.event.ActionEvent e, JPanel p)

应该是

public void actionPerformed(java.awt.event.ActionEvent e)

您必须完全匹配 expected 签名!您不能只是将更多参数添加到您应该覆盖的方法中!

最后,您看到的是,不是,您的代码将在单击按钮时调用该方法。将由Swing框架来完成。告诉你:当对此事发生 action 时,请回叫我的代码。您如何期望该框架知道您要传递其他参数?

除此之外,您还可以将@Override放在希望覆盖该方法的任何方法之前(例如,在本例中,您正在实现该接口的方法)。因为这样编译器才能在您犯此类错误时告诉您!

但是,当然,您添加了该参数,以便侦听器可以使用它。所以:例如通过在您的Main类中添加一个在构造函数中初始化的字段,使它对于侦听器是已知的!因此,当对您的Main实例进行 new 时,不要将面板传递给该方法(无法传递面板)。

答案 1 :(得分:0)

当一个类实现一个接口时,它必须使用与接口中给定的相同参数来实现所需的功能。 如https://docs.oracle.com/javase/7/docs/api/java/awt/event/ActionListener.html

所示,ActionListener仅实现一个功能
void actionPerformed(ActionEvent e);

因此,您必须在您的课程中实现该功能。但是您实现了一个不同的函数,该函数具有相同的名称但参数不同:

void actionPerformed(java.awt.event.ActionEvent e, JPanel p)