如何在JPanel中套入一个JPanel?或有更适合的容器?

在做画图软件时,使用JPanel的repaint实现,由于是矢量图,每种图形都是一个MyShapes的子类,并储存在ArrayList中,每次创建或修改对象时需要完全按顺... 在做画图软件时,使用JPanel的repaint实现,由于是矢量图,每种图形都是一个MyShapes的子类,并储存在ArrayList中,每次创建或修改对象时需要完全按顺序重绘ArrayList中的所有对象,一般大家是这样做的。
我觉得这样可能有点浪费内存,在对象较多时会使程序变慢,希望画板中可以套入一个画板,其中上方的画板背景透明,只绘出当前正在操作的一个图形对象,下面的画板绘出已经画过的所有对象,这样每次创建或修改时只重绘上面的画板,直到改变修改对象时才重绘所有对象,这样的话应该会快一些,感性上来说也较为合理,但是不知道怎样可以实现,希望各位指导一二。
当前的paint函数:
@Override
public void paint(Graphics g){
Graphics2D g2d = (Graphics2D)g;
g2d.clearRect(0, 0, this.getWidth(), this.getHeight());
g2d.setColor(backColor);
g2d.draw(back);
g2d.fill(back);
for(int i = 0;i < shapes.size();i++){
shapes.get(i).paint(g2d);
}
}
展开
 我来答
hardneedl
2010-09-28 · TA获得超过921个赞
知道小有建树答主
回答量:1353
采纳率:57%
帮助的人:605万
展开全部
1)绘图一般子类化 JComponent ,不采用 jpanel 的原因是:Jpanel 带有更多的成员,所以导致类体积增加,我们的目的仅为绘图,无需他用。
2)绘图的时候,可以采用如下思路:
采用 BufferedImage 保存绘图板上的内容,对绘图内容的操作本质上就变成了对BufferedImage的操作。需要刷新到屏幕的时候就直接把 BufferedImage 刷出去就可行

附上代码,学习简洁的代码风格与结构

import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import java.awt.image.*;
/**
* @author Hardneedl
*/
class ImageGraphicsDemo extends JFrame {
private static final Dimension minSize = new Dimension(300, 200);
private static final Dimension maxSize = new Dimension(1024, 768);
private static final Dimension preferredSize = new Dimension(600, 400);
public Dimension getMaximumSize() {return maxSize;}
public Dimension getMinimumSize() {return minSize;}
public Dimension getPreferredSize() {return preferredSize;}
public boolean isResizable() {return false;}
public String getTitle() {return "Frame Title";}
private JComponent canvas = new JComponent(){
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D gg = (Graphics2D)g.create();
gg.drawImage(bufImage,0,0,this);
gg.dispose();
}
};
private BufferedImage bufImage;
ImageGraphicsDemo() throws HeadlessException {
init();
doLay();
attachListeners();
}

private void init() {
bufImage = new BufferedImage(preferredSize.width,preferredSize.height,BufferedImage.TYPE_INT_RGB);
}

private void doLay() {
getContentPane().add(new JButton(new DrawRectangleAction()),BorderLayout.NORTH);
getContentPane().add(canvas,BorderLayout.CENTER);
pack();
}

private void attachListeners() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

private class DrawRectangleAction extends AbstractAction {
private static final int STEP = 25;
private Rectangle rct = new Rectangle(10,10,20,30);
private AffineTransform affine = new AffineTransform();
private DrawRectangleAction() {
super("Draw Rectangle");
putValue(Action.MNEMONIC_KEY, Integer.valueOf('D'));
}
public void actionPerformed(ActionEvent e) {
Graphics2D g = (Graphics2D)bufImage.getGraphics();
g.setColor(Color.PINK);
affine.translate(STEP,STEP);
g.setTransform(affine);
g.draw(rct);
g.dispose();
if(canvas.isVisible()) canvas.paintImmediately(canvas.getBounds());
}
}
public static void main(String[] args) {new ImageGraphicsDemo().setVisible(true);}
}
席锟野妙音
2020-06-18 · TA获得超过4048个赞
知道大有可为答主
回答量:3078
采纳率:25%
帮助的人:214万
展开全部
方法一:去继承jpanel,重写这个方法
方法二:创建jpanel的时候,用匿名类重写:
jpanel
pane
=
new
jpanel(layoutmanager
layout)
{
protected
void
paintcomponent(graphics
g)
{
//code.....
}
};
希望对你有帮助
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式