java - 为什么Java Graphics不画画?

标签 java graphics

我现在对编程有点陌生,正在尝试用 java 制作 Pong。但是我无法显示任何图形。

主类

public class Pong1 {

    public static Frame frame = new Frame();
    public static Panel panel = new Panel();

    public static void main(String[] args) {
        initUI();
    }

    public static void initUI(){

        frame.setLayout(new BorderLayout());
        frame.add(BorderLayout.CENTER, panel);
        frame.pack();
        frame.setVisible(true);
    }

    public static int getPanelWidth(){
        return panel.getWidth();
    }

    public static int getPanelHeight(){
        return panel.getHeight();
    }
}

JFrame 类

package pong1;

import java.awt.Dimension;
import javax.swing.JFrame;

public class Frame extends JFrame{

    Frame(){
        setTitle("Pong");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(true);
        setMinimumSize(new Dimension(800,500));
        setLocationRelativeTo(null);
    }       
}

在最后一个类中是 JPanel 类,我在其中重写并调用paintComponent。然而,什么也没有出现。

public class Panel extends JPanel{

    Panel(){
        setPreferredSize(new Dimension(800,500));
        setMinimumSize(new Dimension(800,500));
    }

    @Override
    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setColor(Color.blue);
        g2.fillOval(100,100,100,100);


    }

我查看了数十篇其他帖子,尝试了许多不同的方法,但什么也没有出现。有谁知道这是怎么回事吗?

最佳答案

我运行了您发布的代码,它似乎工作得很好,但是,对 static 的依赖非常令人担忧,并且可能会导致一些非常有趣的问题,最好避免它。

此外,您应该确保您的 UI 是在事件调度线程的上下文中创建的,以减少可能导致更多问题的线程冲突问题。

最后,您实际上并不需要扩展 JFrame,您并没有真正向类添加任何值,您可以使用工厂或构建器模式以较低的复杂性实现相同的功能

Blue Sun

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Pong1 {

    public static void main(String[] args) {
        new Pong1();
    }

    public Pong1() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Pong");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new Panel());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class Panel extends JPanel {

        public Panel() {
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(800, 500);
        }

        @Override
        public Dimension getMinimumSize() {
            return getPreferredSize();
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            System.out.println("...");
            Graphics2D g2 = (Graphics2D) g;
            g2.setColor(Color.blue);
            g2.fillOval(100, 100, 100, 100);

        }
    }
}

哦,您确实应该避免使用 setPreferred/Minimum/MaximumSize,请参阅 Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?有关该主题的更多讨论

关于java - 为什么Java Graphics不画画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30880708/

相关文章:

java - 如何将网络摄像机的视频传输到 Youtube 上的 LiveStream?

java - 由于守护线程,Jmeter 未完成

c# - 如何组合多个 GeometryGroup 对象?

java - Java 中的 Graphics2D

java - 从多个线程填充 map

Eclipse 中的 Java/C++ 项目管理?

java - Java 中的 String.format() 和十六进制数字

python - Python 中的简单 3D 图形

c++ - 在 Android 上进行实时图形编程的最佳语言是什么?

python - 在 Python 中清除窗口中的图形