我无法让我的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);
}
}
答案 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。