java JPanel重叠覆盖问题。

importjava.awt.Graphics;importjavax.swing.JFrame;importjavax.swing.JPanel;publicclass... import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class paint extends JFrame{
JPanel jp1;
JPanel jp2;
public paint(){
this.add(jp1=new panel1());
jp1.setLayout(null);
jp1.add(jp2 = new panel2());
jp2.setBounds(0, 0, 200, 200);
this.setBounds(400, 200, 200, 200);
this.setVisible(true);
}
public static void main(String[] args) {
new paint();
}
}

class panel1 extends JPanel {
@Override
public void paint(Graphics g) {
g.drawString("jpanel-1", 20, 20);
}
}

class panel2 extends JPanel {
@Override
public void paint(Graphics g) {
g.drawString("jpanel-2", 50, 50);
}
}
以上代码 是我写的测试代码。 jp1 和 jp2 是两个面板,每个面板都画一个字符串,但是我jp1.add(jp2)后,面板内容重叠了, 结果就不显示了。问一下怎么解决这个重叠问题,就是面板透明化。面板不覆盖下层面板上的图像。
对了,如果是代码回复的话,麻烦你们先在本机上测试一下。 碰到好多人发的代码跑都跑不通,或者跑了结果还是原样。
最后,谢谢所有慷慨回答者。
普通面板重叠确定是没问题,但是如果在父面板和子面板上都绘画 就由重叠问题了。
展开
 我来答
隔壁老王叨叨叨
2011-08-26 · TA获得超过7699个赞
知道大有可为答主
回答量:2710
采纳率:0%
帮助的人:2498万
展开全部
首先遗憾的告诉你,add方法添加以后,本来就是覆盖式的,不存在透明化的问题,因为父panel会挨次调用子类的panel的paint方法,将其绘制在自己表面。也就是说,你想通过add,然后设置子面板透明的方法本身是行不通的。

但这并不意味着就没有办法了,很简单,你自己管理绘制就可以了。方法有两种:
1、自己修改一个panel类,继承自JPanel,这个类在paint方法中,先绘制本身的图像,然后才绘制子类的图像,并且会根据子类的图像区域进行透明处理。

2、在一个类中,自己通过内部数据处理,把两个panel的数据进行排比,然后统一画在panel中。

PS:通常用的都是第二种办法。第一种办法实现起来,即不灵活,也不如第二种方法直观快速。
蓝果大刀
2011-08-26 · TA获得超过259个赞
知道小有建树答主
回答量:183
采纳率:0%
帮助的人:238万
展开全部
一般,在我们覆盖JComponent类及其子类的paint方法时,首先要考虑调用父类的paint方法,由它负责调用paintComponent,paintChildren,paintBorder,update方法,以便在组件位置移动,大小变化时绘制组件
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class paint extends JFrame{
JPanel jp1;
JPanel jp2;
public paint(){
this.add(jp1=new panel1());
jp1.setLayout(null);
jp1.add(jp2 = new panel2());
jp2.setBounds(0, 0, 200, 200);
this.setBounds(400, 200, 200, 200);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new paint();
}
}

class panel1 extends JPanel {
@Override
public void paint(Graphics g) {
super.paint(g);
g.drawString("jpanel-1", 20, 20);
}
}

class panel2 extends JPanel {
@Override
public void paint(Graphics g) {
super.paint(g);
g.drawString("jpanel-2", 50, 50);
}
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
砖瓦墙角7047
2011-08-27 · TA获得超过299个赞
知道答主
回答量:519
采纳率:100%
帮助的人:94.6万
展开全部
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Painter extends JFrame
{
private int xValue=0,yValue=0;
public Painter()
{
super("A Simple paint program");

getContentPane().add(new JLabel("Drag the Mouse To Paint"),"South");
/*addMouseMotionListener(
new MouseMotionAdapter(){
public void mouseDragged(MouseEvent e)
{
xValue=e.getX();
yValue=e.getY();
repaint();
}
}
);*/
setSize(300,300);
setVisible(true);
}
/*
public void paint(Graphics g)
{
g.fillOval(xValue,yValue,4,4);
}*/
public static void main(String[] args)
{
Painter frame=new Painter();
}
}

这主要是paint(Griphics g)方法的问题
注意java.awt包和javax.swing包中的类的层次问题

java.lang.Object ->java.awt.Component ->java.awt.Label

java.lang.Object
-> java.awt.Component
-> java.awt.Container
-> javax.swing.JComponent
-> javax.swing.JLabel

而在java.awt.Component和javax.swing.JComponent都分别根据组件的清重量级定义了不同实现方式的paint方法
在你的程序中,你是在JFrame中直接进行绘画,而JFrame属于重量级组件,Label属于偏重量级JLabel属于偏轻(轻重的区别就是是否跟本地系统有太大关系)。。JFrame JWindow JDialog 等等。。并且你绘画的区域和你添加Label
的位置有重叠。。。诸多原因导致了无法显示

建议:将绘画的组件 改成JPanel。。可以多分级绘画,也可以并列多个JPanel,然后分别添加 组件 和绘画,不会重叠。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式