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

我在将代码绘制到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在上面的注释中所述,请避免在repaint()方法中调用paintComponent(),否则您可能陷入无休止的循环,滞后或冻结应用程序。绘画方法仅用于绘画。

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

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

Java Swing SearchBox模型 - java

我需要使用Java Swing的搜索框,如果单击任何建议,当输入字母时它将显示来自数据库的建议,它将执行一些操作。如果有可能在Java swing中,请提供源代码提前致谢 java大神给出的解决方案 您可以使用DefaultComboBoxModel,输出将是这样。Try this在此代码中,您将找到countries数组,因此您需要从数据库中获取此数组。

Java swing-事件触发后,我可以在选项卡上更改名称吗? - java

一,代码:tab_textArea_file.addTab(docLabel, null, scrollPane_textArea, null); 因此,情况是我有一个可供用户选择的文件列表。用户单击文件时,将读取文件的内容并将其加载到textArea中。 “ docLabel”(在上面的代码中)是应该更改为所选文件名的字符串,但并非如此。是否可以通过上面的…

Swing-典型桌面应用程序中的并发 - java

这可能是一个广泛的问题,但我想知道单用户桌面应用程序通常在何处使用并发。您如何发现理想情况下(在设计阶段)并发问题?附注:从操作系统理论上来说,并发问题通常发生在无法共享资源(例如打印机)的情况下。不过,我仍然对在编程级别上可能发生的情况感到迷惑。 java大神给出的解决方案 Event Dispatch thread与其他逻辑之间的Swing中可能存在线程…

Java-搜索字符串数组中的字符串 - java

在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…

Java:正则表达式模式匹配器是否有大小限制? - java

我的模式类似于OR:“word1 | word2 | word3”我大约有800个字。可能有问题吗? 参考方案 您仅受记忆和理智的限制。 :)