关于容器添加组件的层次问题(在线等)

kyousuke 2009-12-29 12:11:20
我想实现裁减一张图片,这张图片放在一个容器里,然后周围有一定大小的透明边框,就像网上那种上传图片要你裁减到合适大小那样!我大概试了一下,发现点问题不是很明白,想请教下各位!

问题1:下面的代码基本能做到我的要求了,就是有个问题,在窗体显示的时候,图片显示在透明边框的上面,把它给覆盖掉了,可是当我把窗体最小化,然后再最大化就出现我想要的效果了! 请解释这个原因!

问题2:透明边框和图片都是两个不同的JPanel,大家看下我添加这两个JPanel的顺序,我是先添加透明边框JPanel再添加图片JPanel的,按道理说应该是图片会覆盖透明边框的JPanel是正常的,可是正如我问题1所说的,最小化然后恢复就变成透明边框JPanel在图片JPanel的上面了,这又是怎么回事?

我用DebugGraphics看了一下它的绘制过程,明显是先画了透明边框JPanel,然后再画图片JPanel,最后还画了一次透明边框JPanel,郁闷!


import java.awt.*;
import javax.swing.*;

public class Program
{
public static final int W = 300;
public static final int H = 300;

public static void main(String[] args)
{
JFrame f = new JFrame();
Container cp = f.getContentPane();
JPanel p = new JPanel();
p.setPreferredSize(new Dimension(Program.W,Program.H));
p.setLayout(null);
cp.add(p);

/*RepaintManager.currentManager(f.getRootPane()).setDoubleBufferingEnabled(false);
p.setDebugGraphicsOptions(DebugGraphics.FLASH_OPTION);
DebugGraphics.setFlashTime(2000);
DebugGraphics.setFlashCount(1);*/

//透明的裁减框
TrimBorder tb = new TrimBorder();
tb.setLocation(0,0);
p.add(tb);

//被裁减的图片
PicturePanel picp = new PicturePanel();
picp.setLocation(0,0);
p.add(picp);



f.pack();
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
/**
*
* 透明边缘的裁减框
*/
class TrimBorder extends JPanel
{
private final int BORDER_PAD = 50;//边框的大小

public TrimBorder()
{
super();
this.setOpaque(false);
this.setSize(Program.W,Program.H);
}

public void paint(Graphics g)
{
super.paint(g);
g.setColor(Color.BLACK);
g.drawRect(BORDER_PAD, BORDER_PAD, Program.W - BORDER_PAD * 2, Program.H - BORDER_PAD * 2);

g.setColor(new Color(0,0,0,100));
g.fillRect(0, 0, Program.W, BORDER_PAD);//顶边框
g.fillRect(0, Program.H - BORDER_PAD, Program.W, BORDER_PAD);//底边框
g.fillRect(0, BORDER_PAD, BORDER_PAD, Program.H - BORDER_PAD * 2);//左边框
g.fillRect(Program.W - BORDER_PAD, BORDER_PAD, BORDER_PAD, Program.H - BORDER_PAD * 2);//右边框
}
}

/**
* 被裁减的图片
*/
class PicturePanel extends JPanel
{
public PicturePanel()
{
super();
this.setSize(Program.W,Program.H);
}

public void paint(Graphics g)
{
super.paint(g);
g.drawImage(Toolkit.getDefaultToolkit().getImage("D:\\1.jpg"), 0, 0, Program.W, Program.H, this);
}
}
...全文
189 2 打赏 收藏 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
kyousuke 2009-12-31
  • 打赏
  • 举报
回复
不知道为什么,莫名其妙的又不出现这种情况了
真是有点无语
Brodie 2009-12-29
  • 打赏
  • 举报
回复
我觉得是这句的问题,
g.drawImage(Toolkit.getDefaultToolkit().getImage("D:\\1.jpg"), 0, 0, Program.W, Program.H, this);
}
}


第四个参数是ImageObserver, 有可能触发了重画的操作。

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧