Java 为什么';这段代码是否绘制并移动一个矩形?

Java 为什么';这段代码是否绘制并移动一个矩形?,java,event-handling,mouseevent,actionlistener,Java,Event Handling,Mouseevent,Actionlistener,我写了一个关于一个简单游戏的代码,但它不起作用。我的意思是矩形没有出现,因此我无法移动它。而且我没有从ide收到错误的消息。我花了好几次时间试图解决这个问题,但都没有结果。。非常感谢您的任何提示或建议。Thx 我写的代码是: import java.awt.*; import java.awt.event.*; import javax.swing.*; public class DataGame extends JFrame { // Create text fields for

我写了一个关于一个简单游戏的代码,但它不起作用。我的意思是矩形没有出现,因此我无法移动它。而且我没有从ide收到错误的消息。我花了好几次时间试图解决这个问题,但都没有结果。。非常感谢您的任何提示或建议。Thx

我写的代码是:

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



public class DataGame extends JFrame {
    // Create text fields for balls are left and time elapsed
    private JTextField jtfBallsRemain, jtfTimeElapsed;
    // Button "New game"
    private JButton jbtStartNewGame = new JButton("New game");

    private Game canvas = new Game();

    // the main method
    public static void main(String[] args) {
        JFrame frame = new DataGame();
        frame.setTitle("Test data game ");
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(470, 300);
        frame.setVisible(true);
    }

    public DataGame() {
        // Use panel1 to hold text fields, labels and the button
        JPanel panel = new JPanel();

        // Add panel to south
        add(panel, BorderLayout.SOUTH);
        panel.add(new JLabel("Balls remain"));
        panel.add(jtfBallsRemain = new JTextField(4));
        panel.add(new JLabel("Time elapsed"));
        panel.add(jtfTimeElapsed = new JTextField(4));
        panel.add(jbtStartNewGame);

        jtfBallsRemain.setEditable(false);
        jtfTimeElapsed.setEditable(false);

        add(canvas, BorderLayout.CENTER); // Add canvas to centre

        // register listener
        jbtStartNewGame.addActionListener(new StartNewGame());

        canvas.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                if (e.getButton() == MouseEvent.BUTTON1)
                    canvas.moveUpRect();
                else if (e.getButton() == MouseEvent.BUTTON3)
                    canvas.moveDownRect();
            }
        });

    }

    class StartNewGame implements ActionListener { // inner class
        @Override
        public void actionPerformed(ActionEvent e) {
            canvas.StartNewGame();
        }
    }

}

class Game extends JPanel {
    //The ball
    private int radius = 10;
    private int x;
    private int y;
    private int dx = 5;
    private int dy = 5;

    //The rectangle
    private int w = 15;
    private int h = 80;
    private int dy1 = 5;
    private int y1 = ((getHeight() / 2) - (h / 2));
    private int x1 = (getWidth() - 50);

    private Timer timer = new Timer(20, new TimerListener());

    public void moveDownRect() {
        y1 += dy1;
        repaint();

    }

    public void moveUpRect() {
        y1 -= dy1;
        repaint();

    }

    public void StartNewGame() {

        timer.start();

    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.GREEN);
        g.fillOval(x, y, 2 * radius, 2 * radius);
        g.setColor(Color.BLUE);
        g.fillRect(x1, y1, w, h);
    }

    class TimerListener implements ActionListener { /*
                                                     * make the TimerListener an
                                                     * inner class of Ball,
                                                     * which allows it to access
                                                     * the variable and methods
                                                     * of Ball
                                                     */
        @Override
        public void actionPerformed(ActionEvent e) {

            if (x < 0 || x + (2 * radius) > getWidth()) {

                dx *= -1;

            }

            if (y < 0 || y + (2 * radius) > getHeight()) {

                dy *= -1;
            }

            x += dx;
            y += dy;

            repaint();
        }
    }

}
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
公共类DataGame扩展了JFrame{
//为球创建文本字段的剩余时间和经过的时间
私人JTextField jtfBallsRemain,JTFTimeed失效;
//按钮“新游戏”
私有JButton jbtStartNewGame=新JButton(“新游戏”);
私人游戏画布=新游戏();
//主要方法
公共静态void main(字符串[]args){
JFrame=newdatagame();
frame.setTitle(“测试数据游戏”);
frame.setLocationRelativeTo(空);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
框架设置尺寸(470300);
frame.setVisible(true);
}
公共数据游戏(){
//使用panel1保存文本字段、标签和按钮
JPanel面板=新的JPanel();
//将面板添加到南部
添加(面板,边界布局。南部);
添加(新的JLabel(“保留球”);
panel.add(jtfBallsRemain=newjtextfield(4));
panel.add(新JLabel(“经过的时间”);
panel.add(jtftimeepersed=newjtextfield(4));
panel.add(jbtStartNewGame);
jtfBallsRemain.setEditable(false);
jtfimeepersed.setEditable(false);
添加(画布,BorderLayout.CENTER);//将画布添加到中心
//寄存器侦听器
jbtStartNewGame.addActionListener(newstartnewgame());
canvas.addMouseListener(新的MouseAdapter(){
@凌驾
公共无效鼠标按下(MouseEvent e){
如果(例如getButton()==MouseEvent.BUTTON1)
canvas.moveUpRect();
else if(e.getButton()==MouseEvent.BUTTON3)
canvas.moveDownRect();
}
});
}
类StartNewName实现ActionListener{//内部类
@凌驾
已执行的公共无效操作(操作事件e){
canvas.StartNewGame();
}
}
}
类游戏扩展JPanel{
//球
私有整数半径=10;
私人INTX;
私营企业;
私有整数dx=5;
私有整数dy=5;
//长方形
私人int w=15;
私有int h=80;
私有整数dy1=5;
私有inty1=((getHeight()/2)-(h/2));
私有int x1=(getWidth()-50);
私人定时器=新定时器(20,新定时器侦听器());
public void moveDownRect(){
y1+=dy1;
重新油漆();
}
公共无效moveUpRect(){
y1-=dy1;
重新油漆();
}
public void startNewName(){
timer.start();
}
@凌驾
受保护组件(图形g){
超级组件(g);
g、 setColor(Color.GREEN);
g、 圆角(x,y,2*半径,2*半径);
g、 setColor(Color.BLUE);
g、 fillRect(x1,y1,w,h);
}
类TimerListener实现ActionListener{/*
*使计时器更精确
*球的内部类,
*允许它访问
*变量与方法
*球的
*/
@凌驾
已执行的公共无效操作(操作事件e){
如果(x<0 | | x+(2*半径)>getWidth()){
dx*=-1;
}
如果(y<0 | | y+(2*半径)>getHeight()){
dy*=-1;
}
x+=dx;
y+=dy;
重新油漆();
}
}
}

当计算
x1
变量时

private int x1 = (getWidth() - 50);
getWidth
将返回
0
,这意味着
x1
将等于
-50
,使其脱离屏幕


更好的解决方案可能是在主窗口变为可见后进行后期初始化

这是一个更好的答案。矩形正在移动…终于!!(我对你们越来越了解..谢谢)