wan*_*810 4 java graphics swing
我在将代码绘制到我的jpanel时遇到了一些麻烦.
除图形绘图外,一切都正常运行.
还有其他答案说我需要使用setSize设置面板的大小,但我已经这样做了.
其他答案说我需要打电话super.paintComponent(g);,但我也这样做.
我错过了什么?
这是我的代码:
在此先感谢您的帮助.
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import static java.awt.Color.*;
public class Main extends JPanel implements KeyListener {
//Declare all class vars.
private Snake snake = new Snake(50,50,50);
//Declare all Player global booleans
private boolean leftPressed, rightPressed, upPressed, downPressed;
//Declare all Gamestate gobal booleans
// private boolean running = true;
public static void main(String[] args){
Main main = new Main();
main.createFrame();
SwingUtilities.invokeLater(main::customUpdate);
}
private void createFrame() {
JFrame frame = new JFrame("Snaek");
JPanel panel = new JPanel();
frame.setResizable(false);
frame.setSize(800,800);
frame.setLocationRelativeTo(null);
frame.add(panel);
frame.setVisible(true);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
panel.requestFocus();
panel.addKeyListener(this);
panel.setSize(new Dimension(frame.getWidth(), frame.getHeight()));
Frame.getFrames();
}
private void customUpdate() {
if(leftPressed) {
snake.changeX(-1);
} else if(upPressed) {
snake.changeY(-1);
} else if(downPressed) {
snake.changeY(1);
} else if(rightPressed) {
snake.changeX(1);
}
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(black);
g.drawRect(snake.getX(), snake.getY(), snake.getSize(), snake.getSize());
g.drawRect(100,100,200,200);
repaint();
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case 37:
// System.out.println("Left?");
leftPressed = true;
break;
case 38:
// System.out.println("Up?");
upPressed = true;
break;
case 39:
// System.out.println("Right?");
rightPressed = true;
break;
case 40:
System.out.println("Down?");
downPressed = true;
break;
case 27: //Escape
System.out.println(snake.getX());
break;
case 50: //Space
// spacePressed = true;
break;
}
}
@Override
public void keyReleased(KeyEvent e) {
System.out.println(e.getKeyCode());
switch (e.getKeyCode()) {
case 37:
// System.out.println("Left?");
leftPressed = false;
break;
case 38:
// System.out.println("Up?");
upPressed = false;
break;
case 39:
// System.out.println("Right?");
rightPressed = false;
break;
case 40:
// System.out.println("Down?");
downPressed = false;
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
你在JPanel这里创建一个新的:
JPanel panel = new JPanel();
Run Code Online (Sandbox Code Playgroud)
然后将其添加到 JFrame
frame.add(panel);
Run Code Online (Sandbox Code Playgroud)
相反,您应该将面板(Main)添加到其中
frame.add(this);
Run Code Online (Sandbox Code Playgroud)
此外,在上述评论的@VinceEmigh的规定,避免调用repaint()的paintComponent()方法,否则你会陷入一个死循环,滞后或在您的应用程序冻结.绘画方法仅用于绘画.
另一个提示,是使用KeyBindings而不是KeyListener或你可能落入你的程序不响应关键事件......
我也会移动frame.setVisible(true);到createFrame()方法结束...
| 归档时间: |
|
| 查看次数: |
477 次 |
| 最近记录: |