java - 为什么 paintComponent 没有在面板上绘制?

标签 java swing graphics

我在将我的代码绘制到我的 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;

        }
    }
}

最佳答案

您正在此处创建一个新的 JPanel:

JPanel panel = new JPanel();

然后将其添加到JFrame

frame.add(panel);

相反,您应该将面板(Main)添加到其中

frame.add(this);

此外,正如@VinceEmigh 在上面的评论中所说,避免在 paintComponent() 方法中调用 repaint() ,否则你可能会陷入死循环,在您的应用程序中滞后或卡住。绘画方法仅供绘画。

另一个技巧是使用 KeyBindings 而不是 KeyListener 否则您可能会陷入程序不响应按键事件的状态...

我还会将 frame.setVisible(true); 行移动到 createFrame() 方法的末尾...

关于java - 为什么 paintComponent 没有在面板上绘制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46102076/

相关文章:

java - 警告 :can't find referenced class

java - 我可以多次更改 JDBC 连接的 AutoCommit 属性吗

java - JFrame 图像图标

java - 旋转和缩放——如何同时进行并获得正确的结果?

java - 使 Java 报告 IPv6 地址而不是 IPv4

java - android - 无特定原因获取 nullpointerexception

java - Swing 的 GUI 指南

java - 为什么我的 SwingWorker 不工作?

java - 如何在java中重新绘制图形?

r - 基于距 0 :0 lines 距离的颜色渐变散点图