Java 为什么';这段代码是否绘制并移动一个矩形?
我写了一个关于一个简单游戏的代码,但它不起作用。我的意思是矩形没有出现,因此我无法移动它。而且我没有从ide收到错误的消息。我花了好几次时间试图解决这个问题,但都没有结果。。非常感谢您的任何提示或建议。Thx 我写的代码是: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
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
,使其脱离屏幕
更好的解决方案可能是在主窗口变为可见后进行后期初始化这是一个更好的答案。矩形正在移动…终于!!(我对你们越来越了解..谢谢)