我正在写一个非常基本的代码,让一个点在屏幕上移动。我的目标是最终有一个冒险游戏。它主要是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();
}
}
当我在计算机上运行时,左右按钮可以正常工作,但上下按钮不起作用。那是什么?
答案 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 = -1
和y++
。请注意,您也可以执行y--