无法在JPanel上绘制椭圆

Olc*_*taş 2 java swing java-2d jpanel paintcomponent

我有一个使用Netbeans的GUI构建器创建的JFrame,它只包含一个JPanel.我创建了一个getPanel获取此JPanel引用的方法:

public class ShowDrawings extends JFrame {

    public ShowDrawings() {
        initComponents();
    }

    public JPanel getPanel(){
        return panel;
    }

    private JPanel panel;
}
Run Code Online (Sandbox Code Playgroud)

在我的主要功能中我正在做:

public class Main {
    public static void main(String[] args){
        ShowDrawings sd = new ShowDrawings();
        sd.setSize(800, 600);
        Graphics g = sd.getPanel().getGraphics();
        g.setColor(Color.BLACK);
        g.drawOval(400, 300, 50, 50);
        sd.getPanel().paint(g);
        sd.repaint();
        sd.setVisible(true);
    }
}
Run Code Online (Sandbox Code Playgroud)

但它没有任何吸引力.请帮我.我已经看了一些相关的问题,但他们都建议扩展JPanel和覆盖其paint方法.但我不想这样做.谢谢.

Dav*_*amp 5

我已经看了一些相关的问题,但他们都建议扩展JPanel和覆盖其paint方法.但我不想这样做

你不应该覆盖JPanel paint()方法paintComponent(..).这是最佳实践,如果您希望代码不会产生异常,则应该这样做.在你当前的方法中做到这一点(正如你所看到的那样)使得创建持久性绘图变得更加困难,因为它们被抹去了repaint()

而是延伸JPanel并覆盖paintComponent(Graphics g)不要忘记super.paintComponent(g)在重写paintComponent(..)方法中调用第一个调用.也不要忘记覆盖getPreferredSize(),JPanel以便我们可以返回正确的尺寸,并pack()可以调用JFrame(+1到@mKorbels评论):

这是一些示例代码:

在此输入图像描述

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Test {

    public Test() {
        initComponents();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Test();
            }
        });
    }

    private void initComponents() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel testPanel = new JPanel() {
            @Override
            protected void paintComponent(Graphics grphcs) {
                super.paintComponent(grphcs);

                Graphics2D g2d = (Graphics2D) grphcs;

                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

                g2d.setColor(Color.GREEN);
                //g2d.drawOval(10,10,100,100);//I like fill :P
                g2d.fillOval(10,10,100,100);

            }

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

        frame.add(testPanel);

        frame.pack();
        frame.setVisible(true);
    }
}
Run Code Online (Sandbox Code Playgroud)