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)后,面板内容重叠了, 结果就不显示了。问一下怎么解决这个重叠问题,就是面板透明化。面板不覆盖下层面板上的图像。
对了,如果是代码回复的话,麻烦你们先在本机上测试一下。 碰到好多人发的代码跑都跑不通,或者跑了结果还是原样。
最后,谢谢所有慷慨回答者。
普通面板重叠确定是没问题,但是如果在父面板和子面板上都绘画 就由重叠问题了。 展开
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)后,面板内容重叠了, 结果就不显示了。问一下怎么解决这个重叠问题,就是面板透明化。面板不覆盖下层面板上的图像。
对了,如果是代码回复的话,麻烦你们先在本机上测试一下。 碰到好多人发的代码跑都跑不通,或者跑了结果还是原样。
最后,谢谢所有慷慨回答者。
普通面板重叠确定是没问题,但是如果在父面板和子面板上都绘画 就由重叠问题了。 展开
3个回答
展开全部
首先遗憾的告诉你,add方法添加以后,本来就是覆盖式的,不存在透明化的问题,因为父panel会挨次调用子类的panel的paint方法,将其绘制在自己表面。也就是说,你想通过add,然后设置子面板透明的方法本身是行不通的。
但这并不意味着就没有办法了,很简单,你自己管理绘制就可以了。方法有两种:
1、自己修改一个panel类,继承自JPanel,这个类在paint方法中,先绘制本身的图像,然后才绘制子类的图像,并且会根据子类的图像区域进行透明处理。
2、在一个类中,自己通过内部数据处理,把两个panel的数据进行排比,然后统一画在panel中。
PS:通常用的都是第二种办法。第一种办法实现起来,即不灵活,也不如第二种方法直观快速。
但这并不意味着就没有办法了,很简单,你自己管理绘制就可以了。方法有两种:
1、自己修改一个panel类,继承自JPanel,这个类在paint方法中,先绘制本身的图像,然后才绘制子类的图像,并且会根据子类的图像区域进行透明处理。
2、在一个类中,自己通过内部数据处理,把两个panel的数据进行排比,然后统一画在panel中。
PS:通常用的都是第二种办法。第一种办法实现起来,即不灵活,也不如第二种方法直观快速。
展开全部
一般,在我们覆盖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);
}
}
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);
}
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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,然后分别添加 组件 和绘画,不会重叠。。
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,然后分别添加 组件 和绘画,不会重叠。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询