我使用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
}
}
}
}
答案 0 :(得分:3)
null
布局。 Swing旨在与布局管理器配合使用。像素完美布局是现代GUI设计中的一种幻觉。您无法控制字体的可用性或在各个系统上呈现它们的方式。布局管理者将猜测工作从确定组件如何协同工作之间的关系setVisible
。如果您需要在框架可见后添加/删除组件,则需要致电revalidate
答案 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的建议 - 使用嵌套布局管理器来实现您想要的效果,而不是预先计算像素值。