Search code examples
javaswingjlabelimageiconnull-layout-manager

JLabel image won't display on JFrame


I've created a Login form for a program using a JFrame. It will display all the text labels, input fields, buttons and other GUI elements but for some reason it will not display my image file (the image "mm.png" is stored in the project's parent directory).

I must be doing something wrong. Perhaps someone could help me.

My code is below.

Many thanks.

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
            }
        }

    }

}

Solution

  • Given what you already have, the issues are that you haven't added the label, and you haven't set its bounds. For instance:

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

    I will second MadProgrammer's recommendations though -- use nested layout managers to achieve what you want, instead of precomputing the pixel values.