0

所以我试图为一个界面创建两个按钮,我尝试实现 ActionListener 以使其中一个按钮能够打印一个字符串,但它给了我一个错误,说“actionlistener 没有在类 BorderDemo 中实现”

我做错了什么?

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferStrategy;
class BorderDemo
implements ActionListener
{
public static void main (String[] args)
{
JFrame F = new JFrame("Buttons");
F.addWindowListener
(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}});
F.setSize(544,416);
JPanel pane = (JPanel) F.getContentPane();
pane.add(new Picture(),BorderLayout.CENTER);
pane.add(new JButton("Start"),BorderLayout.WEST);
pane.addActionListener(this);
pane.add(new JButton("Stop"),BorderLayout.EAST);
F.setVisible(true);
F.setResizable(false);
}
}
class Picture extends JComponent
{
public Picture ()
{
repaint();
}

public void paint (Graphics g)
{
g.setColor(Color.yellow);
g.fillOval(getWidth()/4,getHeight()/4,
getWidth()/2,getHeight()/3);
g.setColor(Color.black);
g.fillOval(getWidth()/2,getHeight()/4,
getWidth()/17,getHeight()/3);
g.setColor(Color.black);
g.fillOval(getWidth()/3,getHeight()/4,
getWidth()/17,getHeight()/3);
g.setColor(Color.white);
g.fillOval(getWidth()/5,getHeight()/5,
getWidth()/5,getHeight()/7);
g.setColor(Color.white);
g.fillOval(getWidth()/3,getHeight()/8,
getWidth()/5,getHeight()/7);
}
public void actionPerformed(ActionEvent e) {
      System.out.println("Item clicked: "+e.getActionCommand());
}
}
4

1 回答 1

1

看起来像是actionPerformed添加到Picture类而不是BorderDemo. 因此,如果将其移入BorderDemo其中应该可以解决上述错误。

错误的原因BorderDemo是声明为实现ActionListener接口的事实:

class BorderDemo implements ActionListener

但是,它没有实现它。中定义的添加actionPerformed方法ActionListener,即:

@Override
public void actionPerformed(ActionEvent arg0) {
}

查看实现接口教程。另请参阅如何编写动作侦听器

一些小评论:

  1. 您可能希望将动作侦听器添加到按钮,而不是JPanel. JPanel不接受动作监听器。

  2. 您可以使用以下方法,而不是将窗口侦听器添加到框架以在关闭时退出应用程序:

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

  3. setSize(544, 416);而不是通过实现和调用框架getPrefferedSize()来设置框架大小。Picturepack();

  4. Picture课堂上,不要覆盖paint(),覆盖paintComponent()。另外,不要忘记调用super.paintComponent()您的实现。请参阅执行自定义绘画

  5. 务必使用invokeLater(). 请参阅初始线程

  6. 正如上面评论中已经提到的,代码可读性非常重要。有关详细信息和示例,请参阅Java 编程语言的代码约定。

编辑:基于在 RTP 1.7 中运行正常的已发布代码的示例

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


class BorderDemo {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowUI();
            }
        });
    }

    public static void createAndShowUI() {
        JFrame frame = new JFrame("Buttons");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JButton startButton = new JButton("Start");
        startButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.out.println("Start clicked");
            }
        });
        JButton stopButton = new JButton("Stop");
        stopButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.out.println("Stop clicked");
            }
        });

        Container contentPane = frame.getContentPane();
        contentPane.add(new Picture(), BorderLayout.CENTER);
        contentPane.add(startButton, BorderLayout.WEST);
        contentPane.add(stopButton, BorderLayout.EAST);

        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        frame.setResizable(false);
    }

    static class Picture extends JComponent {
        public Picture() {
        }

        public Dimension getPreferredSize() {
            return new Dimension(544, 416);
        }

        public void paintComponent(Graphics g) {
            super.paintComponent(g);

            g.setColor(Color.yellow);
            g.fillOval(getWidth() / 4, getHeight() / 4, getWidth() / 2,
                    getHeight() / 3);
            g.setColor(Color.black);
            g.fillOval(getWidth() / 2, getHeight() / 4, getWidth() / 17,
                    getHeight() / 3);
            g.setColor(Color.black);
            g.fillOval(getWidth() / 3, getHeight() / 4, getWidth() / 17,
                    getHeight() / 3);
            g.setColor(Color.white);
            g.fillOval(getWidth() / 5, getHeight() / 5, getWidth() / 5,
                    getHeight() / 7);
            g.setColor(Color.white);
            g.fillOval(getWidth() / 3, getHeight() / 8, getWidth() / 5,
                    getHeight() / 7);
        }
    }
}
于 2013-04-14T04:53:35.230 回答