代码非常相似的按钮都不起作用。为什么?

时间:2014-10-10 17:45:48

标签: java swing actionlistener

我正在写一个非常基本的代码,让一个点在屏幕上移动。我的目标是最终有一个冒险游戏。它主要是GUI,但是我的按钮出现了一些问题。

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

class gui {
    int x = 240;
    int y = 240;
    JPanel panel1 = new JPanel();
    MyDrawPanel drawpanel = new MyDrawPanel();
    public void go() {
        JFrame frame = new JFrame("DotMover");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.getContentPane().add(BorderLayout.CENTER, drawpanel);
        frame.getContentPane().add(BorderLayout.SOUTH, panel1);
        frame.setSize(500, 500);
        drawpanel.repaint();

        JButton leftbutton = new JButton("<----");
        leftbutton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                x = x - 1;
                drawpanel.repaint();
            }
        });
        panel1.add(leftbutton);

        JButton rightbutton = new JButton("---->");
        rightbutton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                x++;
                drawpanel.repaint();
            }
        });
        panel1.add(rightbutton);

        JButton upbutton = new JButton("Up");
        upbutton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                y++;
                drawpanel.repaint();
            }
        });
        panel1.add(upbutton);

        JButton downbutton = new JButton("Down");
        upbutton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                y = y - 1;
                drawpanel.repaint();
            }
        });
        panel1.add(downbutton);
        frame.setVisible(true);
    }

    class MyDrawPanel extends JPanel {
        public void paintComponent(Graphics g) {
            g.setColor(Color.WHITE);
            g.fillRect(0, 0, this.getWidth(), this.getHeight());
            g.setColor(Color.GREEN);
            g.fillOval(x, y, 20, 20);
        }
    }
}

public class dotmoveriii {
    public static void main(String[] args) {
        gui a = new gui();
        a.go();
    }
}

当我在计算机上运行时,左右按钮可以正常工作,但上下按钮不起作用。那是什么?

2 个答案:

答案 0 :(得分:4)

您添加了两个动作侦听器,可以将每个其他效果撤消到向上按钮,而向下按钮上没有动作侦听器。这就是为什么按钮都不会产生任何明显效果的原因。

一个按钮可以有多个动作侦听器。实际上,你的向上按钮向上移动椭圆形,然后立即向下移动。整体效果是椭圆形停留在原位。

显然,您需要做的就是修复复制粘贴错误:

downbutton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        y++; // The "up" button should be y--, because the y axis points down
        drawpanel.repaint();
    }
});

(请注意使用y--代替y = y - 1。由于您已经拥有++,因此没有理由不拥有--

答案 1 :(得分:0)

问题在于:

JButton upbutton = new JButton("Up");
upbutton.addActionListener(new ActionListener()
{
    public void actionPerformed(ActionEvent e)
    {                
        y++;
        drawpanel.repaint();
    }
});
panel1.add(upbutton);

JButton downbutton = new JButton("Down");
upbutton.addActionListener(new ActionListener()
{
    public void actionPerformed(ActionEvent e)
    {
        y = y - 1;
        drawpanel.repaint();
    }
});
panel1.add(downbutton);

创建downbutton后,您再次将监听器添加到upbutton而不是downbutton

因此,每次单击upbutton时,将添加1,然后在第二个侦听器后删除。当按下downbutton时,不会做任何事情,这就是圆圈永远不会移动的原因。

,您的逻辑不正确。要向下移动你需要添加+1而不是删除一个,否则行为将被颠倒。

,我注意到您使用了y = -1y++。请注意,您也可以执行y--