该程序只是为了自学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;
}
}
答案 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)