JPanel Graphics没有绘制任何东西(Java)

时间:2018-06-15 10:20:39

标签: java swing jpanel

我无法让我的JPanel图形工作。它拒绝画任何东西,无论我尝试过什么,我可以在互联网上找到任何东西。

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.Timer;
import java.util.*;
import java.io.*;
public class Mandelbrot{
    public static void main(String[] args){
        JFrame win=new JFrame();
        JPanel dis=new JPanel();
        win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        win.setResizable(false);
        win.setVisible(true);
        win.add(dis);
        dis.setPreferredSize(new Dimension(1000,500));
        win.pack();
        Graphics g=dis.getGraphics();
        g.setColor(Color.red);
        g.fillRect(0, 0, 100, 100);
    }
}

2 个答案:

答案 0 :(得分:2)

发布作为答案,因为我没有评论室:

注意: 如果你需要不断改变事物,那么JPanel可能不是你最好的选择。我建议你重新考虑你想要做的事情,因为你应该使用Canvas或绘画到一堆不同的标签/玻璃窗格并覆盖它们你想要的,这将允许你在前景项目中移动组件/动画,并对背景项进行不同的更改。

或者,您可以让JPanel绘制缓冲图像,或者您可以存储要绘制的项目列表,并且每次都可以绘制它们。对于缓冲图像方法,您可以在每次需要进行更改时直接编辑和绘制到缓冲图像。

以下是如何使用缓冲图像方法的示例。

首先在新类中创建自定义JPanel:

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;

public class DrawPanel extends JPanel{

    public BufferedImage canvas = new BufferedImage(panelWidth, panelHeight, BufferedImage.TYPE_INT_ARGB);

    @Override
    public void paintComponent(Graphics g){
        //Draw the canvas
        g.drawImage(canvas, 0, 0, this);
    }
}

现在,在您的main方法中,您可以将JPanel dis=new JPanel()替换为:

DrawPanel dis = new DrawPanel();

Graphics g=dis.canvas.getGraphics();
g.setColor(Color.red);
g.fillRect(0, 0, 100, 100);

请注意我如何使用dis.canvas获取bufferedImage的图形而不是JPanel的图形。

就这么简单。

根据安德鲁斯的评论。您应该考虑扩展JLabel而不是JPanel,它更轻量级,并且使用label.repaint();更容易更新。

答案 1 :(得分:0)

public static void main(String... args) {
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setResizable(false);
    JPanel panel = new JPanel() {
        @Override
        public void paint(Graphics g) {
            super.paint(g);
            g.setColor(Color.red);
            g.fillRect(0, 0, 100, 100);
        }
    };
    panel.setPreferredSize(new Dimension(640, 480));

    frame.add(panel);
    frame.setVisible(true);
    frame.pack();
}

只是一个例子 - 您应该创建一个新的类子类JPanel,请参阅Painting in AWT and Swing