日期:2014-05-20  浏览次数:20975 次

有关JFrame中背景图片以及JButton显示问题
先给一段代码:

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

public class login extends JFrame implements ActionListener {
private JTextField name=new JTextField();
private JPasswordField password=new JPasswordField();
private JButton beSure=new JButton();
private JButton quit=new JButton();
private JButton register=new JButton();
private String na;
private String pass;
private Image icon=new ImageIcon("Image/login.gif").getImage();
public login(){
//this.setIconImage(icon);

name.setBounds(560 ,87,121,34);//尺寸和位置都是固定好的,因为在图片上面PS了一段空白的地方
password.setBounds(560 ,136,121,34);/尺寸和位置都是固定好的,因为在图片上面PS了一段空白的地方
password.setEchoChar('*');


beSure.setBounds(488,200 ,75 ,40 );//确定按钮显示
beSure.setText( "确定");
beSure.setFont(new Font("华文行楷",Font.BOLD,18));
beSure.setContentAreaFilled(false);
beSure.setVisible(true);

quit.setBounds(595,200 ,75 ,40 );//取消按钮
quit.setText( "取消");
quit.setFont(new Font("华文行楷",Font.BOLD,18));
quit.setContentAreaFilled(false);
quit.setVisible(true);

register.setBounds(490,260,180,40);//新用户注册按钮
register.setText( "新用户注册");
register.setFont( new Font("华文行楷",Font.BOLD,25));
register.setContentAreaFilled(false);


add(name);
name.setHorizontalAlignment(JTextField.CENTER);
add(password);
password.setHorizontalAlignment(JTextField.CENTER);
add(beSure);
add(quit);
add(register);



this.setLayout(null);//login属性设置
setSize( 716, 371);//框架设置成图片的大小
setTitle( "test");
setLocationRelativeTo(null);
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
beSure.addActionListener( this);
quit.addActionListener(this);
register.addActionListener(this);

}
public static void main(String []args){
login l=new login();

}

public void actionPerformed(ActionEvent e){
if(e.getSource()==beSure){
System.out.println(name.getText());
System.out.println(password.getText());
}
else if(e.getSource()==quit){
dispose();
}
else if(e.getSource()==register){
dispose();
}

}
public void paint(Graphics g){
super.paint(g);
g.drawImage(icon, 0, 0, 716,371,this);

}

}

现在的问题是,代码中的三个JButton按钮只有在鼠标移动到上面的时候才会显示,可能的问题是paint方法在构造方法结束后调用,此时以图片为背景才会将JButton覆盖掉,请问怎样才能解决这个问题?



------解决方案--------------------
明白楼主问题所在了
楼主直接重写的是JFrame的paint()方法,
paint()方法是没有二次缓存机制的
画的时候会全部重绘
所以图片会把按钮盖住

应该用一个Panel作为其他组件的载体
重写paintComponent()方法(这个方法画的时候不会把子组件覆盖掉)

改了个程序给你
Java code
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class login extends JFrame implements ActionListener {
private JTextField name=new JTextField();
private JPasswordField password=new JPasswordField();
private JButton beSure=new JButton();
private JButton quit=new JButton();
private JButton register=new JButton();
private String na;
private String pass;
private MyPanel pnlMain;
private Image icon=new ImageIcon("Image/login.gif").getImage();
public login(){
    pnlMain = new MyPanel(icon);
    pnlMain.setLayout(null);
    
name.setBounds(560 ,87,121,34);//尺寸和位置都是固定好的,因为在图片上面PS了一段空白的地方
password.setBounds(560 ,136,121,34);//尺寸和位置都是固定好的,因为在图片上面PS了一段空白的地方
password.setEchoChar('*');


beSure.setBounds(488,200 ,75 ,40 );//确定按钮显示
beSure.setText( "确定");
beSure.setFont(new Font("华文行楷",Font.BOLD,18));
beSure.setContentAreaFilled(false);

quit.setBounds(595,200 ,75 ,40 );//取消按钮
quit.setText( "取消");
quit.setFont(new Font("华文行楷",Font.BOLD,18));
quit.setContentAreaFilled(false);

register.setBounds(490,260,180,40);//新用户注册按钮
register.setText( "新用户注册");
register.setFont( new Font("华文行楷",Font.BOLD,25));
register.setContentAreaFilled(false);


pnlMain.add(name);
name.setHorizontalAlignment(JTextField.CENTER);
pnlMain.add(password);
password.setHorizontalAlignment(JTextField.CENTER);
pnlMain.add(beSure);
pnlMain.add(quit);
pnlMain.add(register);
Container container = getContentPane();
container.add(pnlMain);

setSize( 716, 371);//框架设置成图片的大小
setTitle( "test");
setLocationRelativeTo(null);
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE);
beSure.addActionListener( this);
quit.addActionListener(this);
register.addActionListener(this);
}
public static void main(String []args){
login l=new login();
l.setVisible(true);
}

public void actionPerformed(ActionEvent e){
if(e.getSource()==beSure){
System.out.println(name.getText());
System.out.println(password.getText());
}
else if(e.getSource()==quit){
dispose();
}
else if(e.getSource()==register){
dispose();
}

}

class MyPanel extends JPanel {
    private Image back;
    
    public MyPanel(Image image) {
        super();
        back = image;
    }
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(back, 0, 0, 716,371,this);
    }
}
}