Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Swing getHeight()值从0更改为16_Java_Swing_Jlabel_Jtextfield_Layout Manager - Fatal编程技术网

Java Swing getHeight()值从0更改为16

Java Swing getHeight()值从0更改为16,java,swing,jlabel,jtextfield,layout-manager,Java,Swing,Jlabel,Jtextfield,Layout Manager,我试图在Swing中创建一个框,它有一个“用户”标签、一个用户名文本字段和一个“登录”按钮。这是我的密码 import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; import java.util.*; public class Engine { JFrame frame; public void go() { setUpGui();

我试图在Swing中创建一个框,它有一个“用户”标签、一个用户名文本字段和一个“登录”按钮。这是我的密码

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

public class Engine
{
    JFrame frame;
    public void go()
    {
        setUpGui();
        userNameScreen();
    }
    public void setUpGui()
    {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
    public void userNameScreen()
    {
        JPanel background = new JPanel();
            frame.getContentPane().add(background);
        JLabel labelUserName = new JLabel("User:");
            background.add(labelUserName);
            System.out.println(labelUserName.getHeight()); // 0
        JTextField textFieldUserName = new JTextField();
            System.out.println(labelUserName.getHeight()); // 16
            textFieldUserName.setPreferredSize(new Dimension(110,labelUserName.getHeight()));
            background.add(textFieldUserName);
        JButton buttonSignIn = new JButton("Sign In");
            background.add(buttonSignIn);
        /*
        background.add(labelUserName);
        background.add(textFieldUserName);
        background.add(buttonSignIn);
        frame.getContentPane().add(background);
        */
        frame.pack();
    }
}
我的驱动程序类只是创建引擎的一个实例,然后运行方法go()
我了解到Swing组件在添加之前没有高度/宽度属性(因为这是由布局管理器决定它们有多少空间),因此在方法userNameScreen()中,在末尾添加所有组件*(此处注释)使textFieldUserName变量没有高度是有意义的
但是,您可以在同一个方法userNameScreen()中看到,我已经做到了

System.out.println(labelUserName.getHeight());
两次。第一次,它是0。第二,是16。我不明白为什么第一次,它会将其注册为0。它已经被添加到面板中(在前面的行中),并且在第一个println()和下一个println()之间似乎没有任何东西会改变它的高度。那么,为什么第一个值为0,为什么之后几乎立即变为16?


*我应该注意,当我说添加所有在末尾被注释掉的内容时,它还包括删除/注释代码中其他地方执行的所有相同命令。

我不确定为什么会发生这种情况,但可能是因为添加的组件可能在后台线程上,并且可能在调用下一个语句之前没有更新,并且在几毫秒后更新,并在调用它时出现第二次。

我不确定为什么会发生这种情况,但可能是因为添加的组件可能在后台线程上,并且可能在调用下一个语句之前没有更新,并且在几毫秒后更新,并且在您第二次调用时出现。

这是不创建/修改Swing的副作用EDT上的组件。现在,当您在另一个线程中添加组件时,EDT正忙于进行布局

您的主要方法应该如下所示:

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            new Engine().go();
        }
    });
}

这是不在EDT上创建/修改Swing组件的副作用。现在,当您在另一个线程中添加组件时,EDT正忙于进行布局

您的主要方法应该如下所示:

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            new Engine().go();
        }
    });
}

不相关,但很重要:永远不要出于原因使用setXXSize,请参阅不相关,但很重要:永远不要出于原因使用setXXSize,请参阅他没有创建另一个线程,您说EDT正在忙于布局。EDT应该忙于进行布局。@vedant1811主线程(由JVM创建)不是EDT。当您自动创建组件时,EDT由Swing/AWT创建,因此您(至少)得到两个线程。@Walterlan我现在明白了。所以使用inovkeLater会导致所有东西都在EDT上运行?他没有创建另一个线程,你说EDT正在忙着做布局。EDT应该忙于进行布局。@vedant1811主线程(由JVM创建)不是EDT。当您自动创建组件时,EDT由Swing/AWT创建,因此您(至少)得到两个线程。@Walterlan我现在明白了。那么使用inovkeLater会导致所有东西都在EDT上运行?