读书人

Panel重绘背景后其内部组件可以也重

发布时间: 2013-07-04 11:45:28 作者: rapoo

Panel重绘背景后,其内部组件可以也重绘么?
我给一个Jpanel类重绘了背景。
然后再frame上添加这个对象,显示正常。
但是在这个Jpanel类里面添加新的组件的时候,添加一个button重绘的背景就没了。。
感觉这不合逻辑,但是真的没找到错。
重绘背景的Jpanel类,其中 BackgroundPanel继承Jpanel,在BackgroundPanel类中重写了paintComponent方法。


public class MainPanel extends BackgroundPanel{

private static final long serialVersionUID = 2752472217575142298L;
private UpdateSizePanel updateSizePanel;//修改图片尺寸的panel
private CompressionSpacePanel compressionSpacePanel;//压缩图片大小的panel
private MoveImgPanel moveImgPanel;//移动图片位置的panel
private UpdateSizeBtn updateSizeBtn;//进入修改图片尺寸的button
private CompressionSpaceBtn compressionSpaceBtn;//进入压缩图片大小的button
private MoveImgBtn moveImgBtn;//进入移动图片位置的button
public MainPanel(){
super();
setVisible(true);
setLayout(null);
init();
}
public void init(){
//updateSizePanel=new UpdateSizePanel();
//compressionSpacePanel=new CompressionSpacePanel();
//moveImgPanel=new MoveImgPanel();
//this.add(updateSizePanel);
//this.add(compressionSpacePanel);
//this.add(moveImgPanel);

updateSizeBtn=new UpdateSizeBtn();
//compressionSpaceBtn=new CompressionSpaceBtn("压缩图片");
//moveImgBtn=new MoveImgBtn();

this.add(updateSizeBtn);//这里如果选择添加该按钮,背景就没有了。
//this.add(compressionSpaceBtn);
//this.add(moveImgBtn);
}

按钮类:
继承BackgroundButton类,该类给每个按钮都添加了背景,使用的是super(Icon);
public class UpdateSizeBtn extends BackgroundButton{

private static final long serialVersionUID = -4874921281587699812L;
private JLabel label;
public UpdateSizeBtn(){
super();
setBounds(50, 100, 100, 30);
setLayout(null);
init();
}
private void init(){
label=new JLabel();
label.setBounds(0, 0, 100, 30);
label.setText(" 修改尺寸");
this.add(label);

}
}

[解决办法]
我特意试了一下,背景+ 带背景的按钮

没发现你说的问题。



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


import java.io.*;
import java.awt.image.*;

class BkButton extends JButton
{
String caption;
BufferedImage img = null;
{
try
{
img = ImageIO.read(new File("c:/2.jpg"));
}
catch (Exception e)
{
e.printStackTrace();
}
}

BkButton(String s)
{
super(s);
caption = s;
}

@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.drawImage(img,0,0,img.getWidth(),img.getHeight(),null);
g.setColor(Color.YELLOW);
g.drawString(caption,20,20);
}
}

class BkPanel extends JPanel
{
BufferedImage img = null;
{
try
{
img = ImageIO.read(new File("c:/1.jpg"));
}
catch (Exception e)
{
e.printStackTrace();
}
}

@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.drawImage(img,0,0,img.getWidth(),img.getHeight(),null);
}

}

public class BkGroundTest extends JFrame
{
JPanel panel;
BkGroundTest()
{
panel = new BkPanel();
add(panel);

JButton btn = new BkButton("button");
panel.add(btn);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(0,0,800,600);
setVisible(true);



}

public static void main(String[] args)
{
new BkGroundTest();
System.out.println("Hello World!");
}
}


[解决办法]
我测试了你的 UpdateSizeBtn

结果是,添加这个按钮后,Panel的背景还在,按钮看不到。

解决办法是,就可以看到带图片和文字的 JButton


public UpdateSizeBtn(){
super();
setBounds(50, 100, 100, 30);
//这句有问题。
//setLayout(null);
init();
}


完整源码如下:


import javax.swing.*;
import java.awt.*;
import javax.imageio.*;
import java.io.*;
import java.awt.image.*;

class BackgroundButton extends JButton
{

private static final long serialVersionUID = -4699295098670269297L;


private static ImageIcon button= new ImageIcon("c:/test2.jpg");
//new ImageIcon(BackgroundButton.class.getResource("c:/test2.jpg"));
public BackgroundButton(){

super(button);

System.out.println("aaaa");
}
}

class UpdateSizeBtn extends BackgroundButton{

private static final long serialVersionUID = -4874921281587699812L;
private JLabel label;
public UpdateSizeBtn(){
super();
setBounds(50, 100, 100, 30);
//setLayout(null);
init();
}
private void init(){
label=new JLabel();
label.setBounds(0, 0, getWidth(), getHeight());
label.setText(" 修改尺寸");
add(label);

}
}

class BkButton extends JButton
{
String caption;
BufferedImage img = null;
{
try
{
img = ImageIO.read(new File("c:/2.jpg"));
}
catch (Exception e)
{
e.printStackTrace();
}
}

BkButton(String s)
{
super(s);
caption = s;
}

@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.drawImage(img,0,0,img.getWidth(),img.getHeight(),null);
g.setColor(Color.YELLOW);
g.drawString(caption,20,20);
}
}

class BkPanel extends JPanel
{
BufferedImage img = null;
{
try
{
img = ImageIO.read(new File("c:/1.jpg"));
}
catch (Exception e)
{
e.printStackTrace();
}
}

@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.drawImage(img,0,0,img.getWidth(),img.getHeight(),null);
}

}

public class BkGroundTest extends JFrame
{
JPanel panel;
BkGroundTest()
{
panel = new BkPanel();
add(panel);



JButton btn = new BkButton("button");
panel.add(btn);
btn.add(new JLabel("buutonaa"));

UpdateSizeBtn btn2 = new UpdateSizeBtn();
panel.add(btn2);


setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(0,0,800,600);
setVisible(true);
}

public static void main(String[] args)
{
new BkGroundTest();
System.out.println("Hello World!");
}
}

读书人网 >J2SE开发

热点推荐