Главное должно быть абстрактным, проблема метода ActionPerformed со Слушателем - PullRequest
1 голос
/ 19 мая 2019

Эта программа просто для того, чтобы научить себя 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 голосов
/ 19 мая 2019

Когда класс реализует интерфейс, он должен реализовать требуемые функции с теми же аргументами, что и в интерфейсе. ActionListener реализует только одну функцию, как вы можете видеть на https://docs.oracle.com/javase/7/docs/api/java/awt/event/ActionListener.html

void actionPerformed(ActionEvent e);

Таким образом, вы должны реализовать эту функцию в своем классе. Но вы реализовали другую функцию с тем же именем, но с разными аргументами:

void actionPerformed(java.awt.event.ActionEvent e, JPanel p)
0 голосов
/ 19 мая 2019

Здесь:

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

Должно быть

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

Вы должны точно соответствовать ожидаемой подписи! Вы не можете просто добавить больше параметров к методу, который вы должны переопределить !

Вы видите, в конце концов, это , а не ваш код, который будет вызывать этот метод при нажатии кнопки. Это будет структура Swing, которая сделает это. Вы говорите: когда действие происходит с этой штукой, перезвоните мой код. Как вы ожидаете, что эта структура может знать, что вы хотите, чтобы дополнительный параметр был передан ?!

Помимо этого: сделайте своей практикой ставить @ Override перед любым методом, который, как вы ожидаете, переопределят метод (как в этом случае, когда вы реализуете метод этого интерфейса). Потому что тогда компилятор может сказать вам, когда вы делаете такие ошибки!

Но, конечно, вы добавили этот параметр, чтобы слушатель мог его использовать. Итак: сделайте это известным слушателю, например, добавив поле к вашему классу Main, которое вы инициализируете в конструкторе! Поэтому вместо того, чтобы передавать панель этому единственному методу (куда она не может перейти), передайте ее, когда делаете new для своего экземпляра Main.

...