1

我正在开发 GUI 应用程序,我使用 Swing 组件来设计 GUI。我想为我的表单设置背景图像,但是当我设置图像时,它会覆盖用于设计 GUI 的所有组件。

首先我的没有背景图片的表格如下图所示,

在此处输入图像描述

我的代码是,

登录.java

public class Login extends JFrame{
    public static JFrame myFrame;
    public LoginPanel loginPanel;

    public Login() throws IOException
    {
        initilize();
    }

    public void initilize()throws IOException {

        myFrame = new JFrame("Message"){ 
            private Image backgroundImage = ImageIO.read(new File("D:/Sky.jpg"));
            public void paint( Graphics g ) { 
                super.paint(g);
                g.drawImage(backgroundImage, 0, 0, null);
            }
        };
        myFrame.setLayout(new BorderLayout());

        loginPanel = new LoginPanel();

        //Panel
        Container c = myFrame.getContentPane();

        c.add(loginPanel, BorderLayout.WEST);
        myFrame.setSize(300, 150);
        myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        myFrame.setVisible(true);
        myFrame.setLocationRelativeTo(null);

    } 

    public static void main(String[] arg) {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                try {
                    new Login();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
    }
}

登录面板.java

public class LoginPanel extends JPanel implements ActionListener {
    public JLabel user_no=null;
    public JLabel password=null;
    public JButton btn_login = null;
    public JButton btn_newUser = null;
    public JTextField usernameField=null;
    public JPasswordField passwordField=null;
    public static String userNo;
    public ArrayList msgList = new ArrayList();

    public LoginPanel()
    {
        initilize();
        initConnection();
    }

    private void initilize() {

        Dimension size = getPreferredSize();
        size.width = 285;
        size.height = 150;
        setPreferredSize(size);

        setBorder(BorderFactory.createTitledBorder(null, "Login Details", TitledBorder.CENTER, TitledBorder.TOP));

        user_no = new JLabel("User No : ");

        password = new JLabel("Password : ");

        usernameField = new JTextField(14);

        passwordField = new JPasswordField(14);

        btn_login = new JButton("Login");

        btn_newUser = new JButton("New User");

        setLayout(new GridBagLayout());

        GridBagConstraints gc = new GridBagConstraints();

        //// First column /////////////////////////

        gc.anchor = GridBagConstraints.LINE_START;

        gc.gridx = 0;
        gc.gridy = 0;
        add(user_no, gc);

        gc.gridx = 0;
        gc.gridy = 1;
        add(password, gc);

        //// Second column
        gc.anchor = GridBagConstraints.LINE_START;

        gc.gridx = 1;
        gc.gridy = 0;
        add(usernameField, gc);

        gc.gridx = 1;
        gc.gridy = 1;
        add(passwordField, gc);

        // Final row
        gc.anchor = GridBagConstraints.FIRST_LINE_START;
        gc.gridx = 1;
        gc.gridy = 2;
        add(btn_login, gc);

        gc.anchor = GridBagConstraints.FIRST_LINE_END;
        gc.gridx = 1;
        gc.gridy = 2;
        add(btn_newUser, gc);

    }

    private void initConnection() {
        btn_login.addActionListener(this);
        btn_newUser.addActionListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        if(e.getSource().equals(btn_login))
        {
            userNo = usernameField.getText();
            String userPwd = passwordField.getText();
            System.out.println(userNo+" "+userPwd);
            Connection con = ConnectionImpl.getConnection();

            try
            {
                PreparedStatement pstmt;

                String sql = "SELECT sender_no,pwd FROM tb_login where sender_no ='"+userNo+"'"; 

                pstmt= con.prepareStatement(sql);

                ResultSet rs = pstmt.executeQuery();

                if(rs.next())
                {
                    if(userNo.equalsIgnoreCase(rs.getString(1))&&userPwd.equalsIgnoreCase(rs.getString(2)))
                    {
                        System.out.println("Successfull login");

                        String sql2 = "Select msg from tb_msg where sender_no='"+userNo+"'";

                        pstmt= con.prepareStatement(sql2);

                        ResultSet rs2 = pstmt.executeQuery();

                        while(rs2.next())
                        {
                            msgList.add(rs2.getString(1));
                        }
                        System.out.println("msgList = "+msgList.size());

                        Login.myFrame.dispose();
                        new AddMessage(userNo,msgList);
                    }
                }
            }
            catch (Exception exp) {
                exp.printStackTrace();
            }
        }

        if(e.getSource().equals(btn_newUser))
        {
            Login.myFrame.dispose();
            new NewUser();
        }
    }

}

设置背景图像后,它看起来像这样,

在此处输入图像描述

它隐藏了JButton,的组件JLabel

4

2 回答 2

4

代码需要更接近于此:

登录面板

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.io.*;
import java.sql.*;
import java.util.ArrayList;
import javax.swing.border.TitledBorder;

public class Login extends JFrame{
    public static JFrame myFrame;
    public LoginPanel loginPanel;

    public Login() throws IOException
    {
        initilize();
    }

    public void initilize()throws IOException {
        BufferedImage backgroundImage = new BufferedImage(400,200,BufferedImage.TYPE_INT_RGB);
        myFrame = new JFrame("Message");
        myFrame.setLayout(new BorderLayout());

        loginPanel = new LoginPanel(backgroundImage);

        //Panel
        Container c = myFrame.getContentPane();

        c.add(loginPanel, BorderLayout.WEST);
        //myFrame.setSize(300, 150);
        myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        myFrame.pack();
        myFrame.setVisible(true);
        myFrame.setLocationRelativeTo(null);

    } 

    public static void main(String[] arg) {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                try {
                    new Login();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
    }
}

class LoginPanel extends JPanel implements ActionListener {
    public JLabel user_no=null;
    public JLabel password=null;
    public JButton btn_login = null;
    public JButton btn_newUser = null;
    public JTextField usernameField=null;
    public JPasswordField passwordField=null;
    public static String userNo;
    public ArrayList msgList = new ArrayList();

    private BufferedImage backgroundImage;

    public LoginPanel(BufferedImage backgroundImage)
    {
        this.backgroundImage = backgroundImage;
        initilize();
        initConnection();
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(backgroundImage, 0, 0, getWidth(), getHeight(), this);
    }

    private void initilize() {

        Dimension size = getPreferredSize();
        size.width = 285;
        size.height = 150;
        setPreferredSize(size);

        setBorder(BorderFactory.createTitledBorder(null, "Login Details", TitledBorder.CENTER, TitledBorder.TOP));

        user_no = new JLabel("User No : ");
        password = new JLabel("Password : ");
        usernameField = new JTextField(14);
        passwordField = new JPasswordField(14);
        btn_login = new JButton("Login");
        btn_newUser = new JButton("New User");
        setLayout(new GridBagLayout());

        GridBagConstraints gc = new GridBagConstraints();

        //// First column /////////////////////////

        gc.anchor = GridBagConstraints.LINE_START;

        gc.gridx = 0;
        gc.gridy = 0;
        add(user_no, gc);

        gc.gridx = 0;
        gc.gridy = 1;
        add(password, gc);

        //// Second column
        gc.anchor = GridBagConstraints.LINE_START;

        gc.gridx = 1;
        gc.gridy = 0;
        add(usernameField, gc);

        gc.gridx = 1;
        gc.gridy = 1;
        add(passwordField, gc);

        // Final row
        gc.anchor = GridBagConstraints.FIRST_LINE_START;
        gc.gridx = 1;
        gc.gridy = 2;
        add(btn_login, gc);

        gc.anchor = GridBagConstraints.FIRST_LINE_END;
        gc.gridx = 1;
        gc.gridy = 2;
        add(btn_newUser, gc);

    }

    private void initConnection() {
        btn_login.addActionListener(this);
        btn_newUser.addActionListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        if(e.getSource().equals(btn_login))
        {
            userNo = usernameField.getText();
            String userPwd = passwordField.getText();
            System.out.println(userNo+" "+userPwd);
            Connection con = null;

            try
            {
                PreparedStatement pstmt;
                String sql = "SELECT sender_no,pwd FROM tb_login where sender_no ='"+userNo+"'"; 
                pstmt= con.prepareStatement(sql);
                ResultSet rs = pstmt.executeQuery();
                if(rs.next())
                {
                    if(userNo.equalsIgnoreCase(rs.getString(1))&&userPwd.equalsIgnoreCase(rs.getString(2)))
                    {
                        System.out.println("Successfull login");
                        String sql2 = "Select msg from tb_msg where sender_no='"+userNo+"'";
                        pstmt= con.prepareStatement(sql2);
                        ResultSet rs2 = pstmt.executeQuery();

                        while(rs2.next())
                        {
                            msgList.add(rs2.getString(1));
                        }
                        System.out.println("msgList = "+msgList.size());

                        Login.myFrame.dispose();
                        //new AddMessage(userNo,msgList);
                    }
                }
            }
            catch (Exception exp) {
                exp.printStackTrace();
            }
        }

        if(e.getSource().equals(btn_newUser))
        {
            Login.myFrame.dispose();
            //new NewUser();
        }
    }
}

更多提示

  1. 为了尽快获得更好的帮助,请发布SSCCE
  2. 不要扩展框架,只使用一个实例,但是..
  3. 在这种情况下,根本不使用框架,而是在 aJDialog或 a中显示登录JOptionPane
于 2013-02-20T12:45:24.857 回答
3
  1. ImageLoginPanel (JPanel)而不是ContentPane(不建议直接画到JFrame

  2. 用于JPanel使用paintComponent() 而不是paint(for JFrame)

于 2013-02-20T12:26:06.050 回答