0

我已经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
            }
        }

    }

}
4

4 回答 4

3
  1. 不要使用null布局。Swing 被设计为与布局管理器一起使用。像素完美布局是现代 GUI 设计中的一种错觉。您无法控制字体的可用性或它们在各个系统上的呈现方式。布局管理器消除了确定组件如何协同工作之间的关系的猜测工作
  2. setVisible仅在您完成构建框架的内容后调用。如果您需要在框架可见后添加/删除组件,则需要调用revalidate

查看在容器内布局组件以获取更多详细信息

于 2014-04-07T20:29:17.047 回答
1
    ImageIcon icon = new ImageIcon("mm.png");
    JLabel label = new JLabel(icon);

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

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

于 2014-04-07T20:49:07.613 回答
0

鉴于您已经拥有的,问题是您没有添加标签,也没有设置它的界限。例如:

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

不过,我将支持 MadProgrammer 的建议——使用嵌套布局管理器来实现您想要的,而不是预先计算像素值。

于 2014-04-07T21:25:17.997 回答
0

我刚刚发现,实际上我遇到了同样的问题,我的图像不会显示在标签上,所以我发现,当您使用 (null) 布局时,请确保在使用setBounds()函数时,请确保宽度和高度必须与您使用的图片或图标相同。

例子

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

public class MyFrame extends JFrame{
    JLabel label;
    ImageIcon icon;

    MyFrame(){
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setSize(500, 500);
        this.setLayout(null);
        getContentPane().setBackground(Color.BLACK);
    
        icon = new ImageIcon("icon.png"); // this icon's width and height is 126
    
        label = new JLabel();
        label.setIcon(icon);
        label.setBounds(0,0,216,216); // 216 is width and height of my image 
    
        this.add(label);
        this.setVisible(true);
    }
}

我希望这对您有意义,并且您知道在使用setBounds时必须传递图标/图像的宽度和高度

于 2021-10-10T08:04:28.890 回答