Java 无法在Swing中显示标签和文本字段

Java 无法在Swing中显示标签和文本字段,java,swing,Java,Swing,我刚开始学习Swing,用一个简单的代码创建登录表单 package swingbeginner; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent

我刚开始学习Swing,用一个简单的代码创建登录表单

package swingbeginner;

import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

public class LoginForm {
    private JFrame mainFrame;
    private JLabel headerLabel;
    private JLabel inputLabel;
    private JPanel inputPanel;
    private JPanel controlPanel;
    private JLabel statusLabel;

    public LoginForm() {
        prepareGUI();
    }

    public static void main(String[] args) {
        LoginForm loginForm = new LoginForm();
        loginForm.loginProcess();
    }

    private void prepareGUI() {
        mainFrame = new JFrame("Login");
        mainFrame.setSize(600, 600);
        mainFrame.setLayout(new FlowLayout());

        headerLabel = new JLabel("",JLabel.CENTER );
        statusLabel = new JLabel("",JLabel.CENTER);   

        statusLabel.setSize(350,100);

        mainFrame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent windowEvent) {

            }
        });

        inputLabel = new JLabel();
        inputLabel.setLayout(null);

        inputPanel = new JPanel();
        inputPanel.setLayout(null);

        controlPanel = new JPanel();
        controlPanel.setLayout(new FlowLayout());

        mainFrame.add(headerLabel);
        mainFrame.add(inputLabel);
        mainFrame.add(inputPanel);
        mainFrame.add(controlPanel);
        mainFrame.add(statusLabel);
        mainFrame.setVisible(true);
    }

    private void loginProcess() {
        headerLabel.setText("Please Login to Continue!");

        JLabel usernameLabel = new JLabel("Username");
        usernameLabel.setBounds(10,20,80,25);
        JLabel passwordLabel = new JLabel("Password");
        passwordLabel.setBounds(10, 20, 80, 25);

        JTextField usernameTextbox = new JTextField();
        usernameTextbox.setBounds(100,20,165,25);
        JPasswordField passwordTextbox = new JPasswordField();
        passwordTextbox.setBounds(100,20,165,25);

        JButton loginButton = new JButton("Login");
        JButton cancelButton = new JButton("Cancel");

        loginButton.setActionCommand("Login");
        cancelButton.setActionCommand("Cancel");

        loginButton.addActionListener(new ButtonClickListener());
        cancelButton.addActionListener(new ButtonClickListener());

        inputLabel.add(usernameLabel);
        inputPanel.add(usernameTextbox);
        inputLabel.add(passwordLabel);
        inputPanel.add(passwordTextbox);

        controlPanel.add(loginButton);
        controlPanel.add(cancelButton);

        mainFrame.setVisible(true);     
    }


    private class ButtonClickListener implements ActionListener {
        public void actionPerformed(ActionEvent actionEvent) {
            String command = actionEvent.getActionCommand();
            if(command.equals("Login")) {
                statusLabel.setText("Logging In");
            }
            else if(command.equals("Cancel")) {
                statusLabel.setText("Login Cancelled");
            }
        }
    }

}
我的代码显示标题以及登录和取消按钮。但标签/文本字段用户名和密码未显示在面板中


哪里出错了?

您正在向inputLabel添加标签/TextfieldUsername和密码,inputLabel是JLabel的一个实例,它不是容器类型

改变

inputLabel.add(usernameLabel);
inputPanel.add(usernameTextbox);
inputLabel.add(passwordLabel);
inputPanel.add(passwordTextbox);

也给JTextField一个默认大小,所以

JTextField usernameTextbox = new JTextField();
JPasswordField passwordTextbox = new JPasswordField();

或者您可以将inputLabel变量的类型更改为JPanel,并将其设置为类似FlowLayout的布局。 在这种情况下,无需对组件使用setBounds方法


注意:您对多个组件使用相同的边界,这将使它们彼此重叠。

您正在将usernameLabel和passwordLabel添加到另一个标签inputLabel上。[堆叠标签时,最上面的标签将覆盖,这些标签将消失。]!为什么不将所有标签和字段直接添加到大型机,即JFrame对象

由于每个人都忽略了空布局的事实,我将自己创建一个答案

inputPanel.setLayout(null);
如果向其中添加组件,则必须指定位置,或者只需使用类似BorderLayout或FlowLayout的layoutmanager

如果您使用它,您将能够简单地将组件添加到JPanel。正如其他答案中所述,不要将JLabel添加到其他JLable,因为最上面的一个将覆盖其他JLabel。话虽如此,解决方案代码应该是这样的:

public class LoginForm {
    private JFrame mainFrame;
    private JLabel headerLabel;
    private JPanel inputPanel;
    private JPanel controlPanel;
    private JLabel statusLabel;

    public LoginForm() {
        prepareGUI();
    }

    public static void main(String[] args) {
        LoginForm loginForm = new LoginForm();
        loginForm.loginProcess();
    }

    private void prepareGUI() {
        mainFrame = new JFrame("Login");
        mainFrame.setSize(600, 600);
        mainFrame.setLayout(new FlowLayout());

        headerLabel = new JLabel("",JLabel.CENTER );
        statusLabel = new JLabel("",JLabel.CENTER);   

        statusLabel.setSize(350,100);

        mainFrame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent windowEvent) {

            }
        });
        //changes here
        inputPanel = new JPanel();
        inputPanel.setLayout(new FlowLayout());

        controlPanel = new JPanel();
        controlPanel.setLayout(new FlowLayout());

        mainFrame.add(headerLabel);
        mainFrame.add(inputLabel);
        mainFrame.add(inputPanel);
        mainFrame.add(controlPanel);
        mainFrame.add(statusLabel);
        mainFrame.setVisible(true);
    }

    private void loginProcess() {
        headerLabel.setText("Please Login to Continue!");

        JLabel usernameLabel = new JLabel("Username");
        usernameLabel.setBounds(10,20,80,25);
        JLabel passwordLabel = new JLabel("Password");
        passwordLabel.setBounds(10, 20, 80, 25);

        JTextField usernameTextbox = new JTextField();
        usernameTextbox.setBounds(100,20,165,25);
        JPasswordField passwordTextbox = new JPasswordField();
        passwordTextbox.setBounds(100,20,165,25);

        JButton loginButton = new JButton("Login");
        JButton cancelButton = new JButton("Cancel");

        loginButton.setActionCommand("Login");
        cancelButton.setActionCommand("Cancel");

        loginButton.addActionListener(new ButtonClickListener());
        cancelButton.addActionListener(new ButtonClickListener());

        inputPanel.add(usernameLabel); //changes here
        inputPanel.add(usernameTextbox);
        inputPanel.add(passwordLabel);  //changes here
        inputPanel.add(passwordTextbox);

        controlPanel.add(loginButton);
        controlPanel.add(cancelButton);

        mainFrame.setVisible(true);     
    }


    private class ButtonClickListener implements ActionListener {
        public void actionPerformed(ActionEvent actionEvent) {
            String command = actionEvent.getActionCommand();
            if(command.equals("Login")) {
                statusLabel.setText("Logging In");
            }
            else if(command.equals("Cancel")) {
                statusLabel.setText("Login Cancelled");
            }
        }
    }

}
以下是您的解决方案:


这是因为您将它们添加到的JPanel中有空布局。在您的JPanel上使用任何layoutmanager,它都会工作。在空布局中,我想你必须告诉对象它们显示的位置Java GUI必须在不同的操作系统、屏幕大小、屏幕分辨率等上工作,在不同的地区使用不同的PLAF。因此,它们不利于像素完美布局。而是使用布局管理器,或者与布局填充和边框一起显示.Jtextfields,即使您没有为其设置任何大小。他的问题是他在JPanel上有空布局。如果他在组件上使用setBounds方法,空布局可以用来定义。但是他将一个又一个的边界设置为组件的相同边界。这与指定组件的位置和在1行中设置大小相同。您仍然有成员变量,并且没有解释你到底做了什么。改变这些事情,你就不会感到沮丧,谢谢。这就是我几乎需要的。再加上一件事,当版面用水平和垂直间隙硬编码时,我不必使用setBound作为Labelusername和PasswordThank作为版面的信息。另外,编辑后您给我的代码需要一些更改,比如根据您使用的FlowLayout代码。正因为如此,框架中的所有元素看起来都像一行中的相邻元素。相反,我使用了controlPanel.setLayoutnew FlowLayoutFlowLayout.CENTER,100,10;这对我的场景很有效
inputPanel.setLayout(null);
inputPanel.setLayout(new FlowLayout());
public class LoginForm {
    private JFrame mainFrame;
    private JLabel headerLabel;
    private JPanel inputPanel;
    private JPanel controlPanel;
    private JLabel statusLabel;

    public LoginForm() {
        prepareGUI();
    }

    public static void main(String[] args) {
        LoginForm loginForm = new LoginForm();
        loginForm.loginProcess();
    }

    private void prepareGUI() {
        mainFrame = new JFrame("Login");
        mainFrame.setSize(600, 600);
        mainFrame.setLayout(new FlowLayout());

        headerLabel = new JLabel("",JLabel.CENTER );
        statusLabel = new JLabel("",JLabel.CENTER);   

        statusLabel.setSize(350,100);

        mainFrame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent windowEvent) {

            }
        });
        //changes here
        inputPanel = new JPanel();
        inputPanel.setLayout(new FlowLayout());

        controlPanel = new JPanel();
        controlPanel.setLayout(new FlowLayout());

        mainFrame.add(headerLabel);
        mainFrame.add(inputLabel);
        mainFrame.add(inputPanel);
        mainFrame.add(controlPanel);
        mainFrame.add(statusLabel);
        mainFrame.setVisible(true);
    }

    private void loginProcess() {
        headerLabel.setText("Please Login to Continue!");

        JLabel usernameLabel = new JLabel("Username");
        usernameLabel.setBounds(10,20,80,25);
        JLabel passwordLabel = new JLabel("Password");
        passwordLabel.setBounds(10, 20, 80, 25);

        JTextField usernameTextbox = new JTextField();
        usernameTextbox.setBounds(100,20,165,25);
        JPasswordField passwordTextbox = new JPasswordField();
        passwordTextbox.setBounds(100,20,165,25);

        JButton loginButton = new JButton("Login");
        JButton cancelButton = new JButton("Cancel");

        loginButton.setActionCommand("Login");
        cancelButton.setActionCommand("Cancel");

        loginButton.addActionListener(new ButtonClickListener());
        cancelButton.addActionListener(new ButtonClickListener());

        inputPanel.add(usernameLabel); //changes here
        inputPanel.add(usernameTextbox);
        inputPanel.add(passwordLabel);  //changes here
        inputPanel.add(passwordTextbox);

        controlPanel.add(loginButton);
        controlPanel.add(cancelButton);

        mainFrame.setVisible(true);     
    }


    private class ButtonClickListener implements ActionListener {
        public void actionPerformed(ActionEvent actionEvent) {
            String command = actionEvent.getActionCommand();
            if(command.equals("Login")) {
                statusLabel.setText("Logging In");
            }
            else if(command.equals("Cancel")) {
                statusLabel.setText("Login Cancelled");
            }
        }
    }

}
package swingbeginner;

public class LoginForm {

    private JFrame mainFrame;

    private JLabel headerLabel;

    private JLabel inputLabel;

    private JPanel inputPanel;

    private JPanel controlPanel;

    private JLabel statusLabel;

    public LoginForm() {
        prepareGUI();
    }

    public static void main(String[] args) {

        LoginForm loginForm = new LoginForm();
        loginForm.loginProcess();
    }

    private void prepareGUI() {

        mainFrame = new JFrame("Login");
        mainFrame.setSize(600, 600);
        mainFrame.setLayout(new BorderLayout());

        headerLabel = new JLabel("header", JLabel.CENTER);
        statusLabel = new JLabel("status", JLabel.CENTER);

        statusLabel.setSize(350, 100);

        mainFrame.addWindowListener(new WindowAdapter() {

            public void windowClosing(WindowEvent windowEvent) {

            }
        });

        controlPanel = new JPanel();
        controlPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 100, 100));

        mainFrame.add(headerLabel, BorderLayout.NORTH);
        mainFrame.add(controlPanel, BorderLayout.CENTER);
        mainFrame.add(statusLabel, BorderLayout.SOUTH);
        mainFrame.setVisible(true);
    }

    private void loginProcess() {

        headerLabel.setText("Please Login to Continue!");

        JLabel usernameLabel = new JLabel("Username");
        usernameLabel.setBounds(10, 20, 80, 25);
        JLabel passwordLabel = new JLabel("Password");
        passwordLabel.setBounds(10, 20, 80, 25);

        JTextField usernameTextbox = new JTextField(20);
        usernameTextbox.setBounds(100, 20, 165, 25);
        JPasswordField passwordTextbox = new JPasswordField(20);
        passwordTextbox.setBounds(100, 20, 165, 25);

        JButton loginButton = new JButton("Login");
        JButton cancelButton = new JButton("Cancel");

        loginButton.setActionCommand("Login");
        cancelButton.setActionCommand("Cancel");

        loginButton.addActionListener(new ButtonClickListener());
        cancelButton.addActionListener(new ButtonClickListener());

        controlPanel.add(usernameLabel);
        controlPanel.add(usernameTextbox);
        controlPanel.add(passwordLabel);
        controlPanel.add(passwordTextbox);
        controlPanel.add(loginButton);
        controlPanel.add(cancelButton);

        mainFrame.setVisible(true);
    }

    private class ButtonClickListener implements ActionListener {

        public void actionPerformed(ActionEvent actionEvent) {

            String command = actionEvent.getActionCommand();
            if (command.equals("Login")) {
                statusLabel.setText("Logging In");
            }
            else if (command.equals("Cancel")) {
                statusLabel.setText("Login Cancelled");
            }
        }
    }
}