首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java相关 >

有关JFrame中背景图片以及JButton显示有关问题

2012-04-05 
有关JFrame中背景图片以及JButton显示问题先给一段代码:import javax.swing.*import java.awt.*import j

有关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);    }}} 

热点排行