有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java小程序中的“抽象”标签

我正在编写一个小程序,它将显示鼠标单击按钮的次数,另一个小程序将显示鼠标单击的坐标,并将背景颜色更改为随机颜色

在这两种情况下,我都遇到了BlueJ中的“不是抽象的,也不重写抽象方法”错误,我需要帮助理解我做错了什么。我对此非常陌生,因此欢迎提供任何提示/校对:)

以下是第一个小程序:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Option1 extends Frame implements ActionListener {
public void main (String[] args) {
int click = 0;

JFrame base = new JFrame ("Button Click Counter");
base.getContentPane().setLayout(null);
base.setSize(500,500);
base.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JButton button = new JButton("Click Me!");
button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed (ActionEvent e) {
        click++; }
    }); 

    JTextField count = new JTextField(click);

        this.add(button);
        this.add(count);

    }}    

坐标一:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.Random;

public class Option2 extends Frame implements MouseListener {
double x;
double y;
public void init() {
addMouseListener(this);


JFrame base = new JFrame("Mouse Coordinates");
base.getContentPane().setLayout(null);
base.setSize(500,500);
base.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


JTextField answer = new JTextField(x + "," + y);
}
public void mouseClicked( MouseEvent e ) {
    x = e.getX();
    y = e.getY();

    this.setBackground(new Color((int)(Math.random() * 0x1000000)));
}}

提前谢谢


共 (2) 个答案

  1. # 1 楼答案

    您正在实现一个接口

    至少你在写作的时候会这么做

    public class Option1 extends Frame implements ActionListener
    

    但是你没有遵守你的合同!如果你说你实现了ActionListener,那么你保证你有这个方法

    public void actionPerformed(ActionEvent e) {        
    }
    

    但您的代码缺少此方法-这是您的错误消息

  2. # 2 楼答案

    Option1声明实现ActionListener接口:

    public class Option1 extends Frame implements ActionListener {
    

    如果一个类这样做,它必须是抽象的(Option1不是),或者它必须实现接口中声明的方法。当您查看API for ActionListener时,您会发现其中有一个方法:

    void actionPerformed(ActionEvent e)
    

    您需要在选项1中实现此方法,例如

    @Override
    public void actionPerformed(ActionEvent e) {
        click++;
    }
    

    然后将选项1注册为ActionListener:

    button.addActionListener(this);
    

    您尝试的是在匿名内部类中实现ClickListener,这也可以,但在本例中,Option1不能实现ActionListener

    选项1中的main方法没有正确声明,通常是

    public static void main(String[] args)
    

    但是在main方法中进行的初始化应该在构造函数中完成,或者(与Option2一样)在单独的方法中完成

    public class Option1 extends Frame implements ActionListener {
    
        private int click = 0;
    
        public Option1() {
    
            JFrame base = new JFrame("Button Click Counter");
            base.getContentPane().setLayout(null);
            base.setSize(500, 500);
            base.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            JButton button = new JButton("Click Me!");
            button.addActionListener(this);
            JTextField count = new JTextField(click);
            this.add(button);
            this.add(count);
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
            click++;
        }
    }
    

    Option2的问题在于,您只实现了从interface MouseListener中单击鼠标的方法。还有几项需要实施:

    void mouseEntered(MouseEvent e)
    void mouseExited(MouseEvent e)
    void mousePressed(MouseEvent e)
    void mouseReleased(MouseEvent e)
    

    即使您不想处理这些事件,也需要使用空方法

    最后一点提示:我不知道您的IDE,但许多IDE(Eclipse、Netbeans、IntelliJ)都有一个选项,可以为您的接口生成所需的方法,这节省了大量的键入工作;)