Bal*_*m26 0 java swing java-2d jpanel repaint
问题:我正在尝试使用基于用户操作的新绘制对象更新画布.画布剂量得到更新.
我做了什么:用户与DnD动作交互,可转移对象到达画布,调用由我创建的更新图形方法.并且该方法只需使用aldready创建的图形2D对象,并使用它.我已经checkd免打扰作用将图像,对象正确recived在Canvas类,我能打印出来使用System.out.println.
示例代码,具有与我的类似的功能,
油漆类:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JPanel;
public class PaintPanel extends JPanel{
private Graphics2D drawImage;
public PaintPanel()
{
}
@Override
public void paint(Graphics g) {
drawImage = (Graphics2D) g;
drawImage.setColor(Color.WHITE);
drawImage.fillRect(0, 0, getWidth(), getHeight());
}
public void updateGraphics(int length,int width)
{
drawImage.setColor(Color.black);
drawImage.drawRect(100, 150, length, width);
repaint();
}
}
Run Code Online (Sandbox Code Playgroud)
大型机类:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class MainPaint extends JFrame{
public MainPaint()
{
setTitle("test paint");
setSize(400,400);
setLayout(new BorderLayout());
final PaintPanel paintPan = new PaintPanel();
JButton testButon = new JButton("Display shape");
add(paintPan,BorderLayout.CENTER);
add(testButon,BorderLayout.PAGE_END);
testButon.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
paintPan.updateGraphics(50,50);
repaint();
}
});
setVisible(true);
}
public static void main(String[] args)
{
new MainPaint();
}
}
Run Code Online (Sandbox Code Playgroud)
Graphics2D drawImage; //source of the problem!
Run Code Online (Sandbox Code Playgroud)
不要尝试缓存Graphics(或Graphics2D)实例!代替:
repaint().paintComponent(Graphics)绘制对象列表.另一种方法是使用a BufferedImage作为绘图对象.请参阅此答案 以获取示例.


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MainPaint extends JFrame {
public MainPaint() {
setTitle("test paint");
setSize(400, 400);
setLayout(new BorderLayout());
final PaintPanel paintPan = new PaintPanel();
JButton testButon = new JButton("Display shape");
add(paintPan, BorderLayout.CENTER);
add(testButon, BorderLayout.PAGE_END);
testButon.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
paintPan.updateGraphics(50, 50);
repaint();
}
});
setVisible(true);
}
public static void main(String[] args) {
new MainPaint();
}
}
class PaintPanel extends JPanel {
private int x, y;
private Color color = null;
public PaintPanel() {
setBackground(Color.ORANGE);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D drawImage = (Graphics2D) g;
if (color != null) {
drawImage.setColor(color);
drawImage.drawRect(100, 150, x, y);
}
}
public void updateGraphics(int length, int width) {
color = Color.RED;
x = length;
y = width;
repaint();
}
}
Run Code Online (Sandbox Code Playgroud)
关于该代码仍有许多需要改变的事情.我决定停在最早的变体上,它可以在按钮点击时显示矩形.