JLabel图像不会在JFrame上显示

时间:2014-04-07 20:25:10

标签: java swing jlabel imageicon null-layout-manager

我使用Login为程序创建了JFrame表单。它将显示所有文本标签,输入字段,按钮和其他GUI元素,但由于某种原因它不会显示我的图像文件(图像"mm.png"存储在项目的父目录中)。

我一定是做错了。也许有人可以帮助我。

我的代码如下。

非常感谢。

import java.io.*;
import java.net.*;
import java.awt.*;//contains layouts, buttons etc.
import java.awt.event.*; //contains actionListener, mouseListener etc.

import javax.swing.*; //allows GUI elements

public class Login extends JFrame implements ActionListener, KeyListener {

    private JLabel usernameLabel = new JLabel("Username/Email:");
    private JLabel userPasswordLabel = new JLabel("Password:");
    public JTextField usernameField = new JTextField();
    private JPasswordField userPasswordField = new JPasswordField();
    private JLabel status = new JLabel("Status: Not yet logged in.");

    private JButton loginButton = new JButton("Login");
    private JButton registerButton = new JButton("New User");

    public Login() {
        super("Please Enter Your Login Details...");// titlebar
        setVisible(true);
        setSize(400, 260);
        this.setLocationRelativeTo(null); // places frame in center of screen
        this.setResizable(false); // disables resizing of frame
        this.setLayout(null); // allows me to manually define layout of text
                                // fields etc.

        ImageIcon icon = new ImageIcon("mm.png");
        JLabel label = new JLabel(icon);

        this.add(usernameLabel);
        this.add(userPasswordLabel);
        this.add(usernameField);
        this.add(userPasswordField);
        this.add(loginButton);
        this.add(registerButton);
        this.add(status);

        usernameLabel.setBounds(30, 100, 120, 30); // (10, 60, 120, 20);
        userPasswordLabel.setBounds(30, 125, 80, 30);// (10, 85, 80, 20);
        usernameField.setBounds(150, 100, 220, 30);
        userPasswordField.setBounds(150, 125, 220, 30);
        loginButton.setBounds(150, 180, 110, 25);
        registerButton.setBounds(260, 180, 110, 25);
        status.setBounds(30, 210, 280, 30);
        status.setForeground(new Color(50, 0, 255)); // sets text colour to blue

        loginButton.addActionListener(this);
        registerButton.addActionListener(this);
        registerButton.setEnabled(false);
        userPasswordField.addKeyListener(this);

    }

    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void keyPressed(KeyEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == loginButton) {
            String userName = usernameField.getText();
            String password = userPasswordField.getText();
            if (userName.equals("mick") && password.equals("mick")) {
                status.setText("Status: Logged in.");
                this.setVisible(false);
                new Client("127.0.0.1").startRunning();
            } else {
                status.setText("Status: Password or username is incorrect.");
                status.setForeground(new Color(255, 0, 0)); // changes text
                                                            // colour to red
            }
        }

    }

}

3 个答案:

答案 0 :(得分:3)

  1. 不要使用null布局。 Swing旨在与布局管理器配合使用。像素完美布局是现代GUI设计中的一种幻觉。您无法控制字体的可用性或在各个系统上呈现它们的方式。布局管理者将猜测工作从确定组件如何协同工作之间的关系
  2. 开始
  3. 仅在完成构建框架内容后调用setVisible。如果您需要在框架可见后添加/删除组件,则需要致电revalidate
  4. 请查看Laying Out Components Within a Container了解详情

答案 1 :(得分:1)

    ImageIcon icon = new ImageIcon("mm.png");
    JLabel label = new JLabel(icon);
  

但由于某种原因,它不会显示我的图像文件

您创建了Icon和JLabel,但我没有看到您将标签添加到GUI的位置。

答案 2 :(得分:0)

鉴于你已经拥有的东西,问题在于你还没有添加标签,而你还没有设置它的界限。例如:

this.add(label);
label.setBounds(130, 10, 140, 80);

我将推荐MadProgrammer的建议 - 使用嵌套布局管理器来实现您想要的效果,而不是预先计算像素值。