为什么Java Graphics不能绘画?

时间:2015-06-17 01:03:45

标签: 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);


    }

我看过其他几十个帖子,我尝试了很多不同的东西,但没有任何表现。有谁知道发生了什么?

1 个答案:

答案 0 :(得分:2)

我运行你发布的代码,它似乎工作得很好,但是,对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?以了解有关该主题的更多讨论