Java Swing 标签未出现

Java Swing Label not appearing

这是我第一次学习 Java Swing,我有一个标签,但 setLocation 不起作用。有人告诉我这是因为你必须将布局设置为 null,否则它们将设置为默认位置和大小。我这样做了,但现在我的标签没有出现

import java.util.*;
import javax.swing.*; 
public class School {
    private ArrayList <String> Usernames = new ArrayList <> ();
    private ArrayList <String> Passwords = new ArrayList <> ();
    public void registerUser(){
        JFrame Register = new JFrame("Register");  
        JLabel Username = new JLabel("Username: ");
        Username.setBounds(50, 50, 100, 30);
        Register.add(Username);
        Register.setVisible(true);
        Register.setSize(500, 500);
        Register.setLayout(null);
        Register.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    public static void main (String [] args){
        School example = new School();
        example.registerUser();
    }
}

这是一个简单的例子,我在其中纠正了一些问题。

  1. 我使用的是默认布局,而不是 null。如果您了解如何使用默认值,它们会很好用。

  2. 我使用JPanel而不是直接向JFrame添加组件。 JFrames实际上使用了一个相当混乱的布局,最好把东西放在一个面板中,这样布局更直观。

  3. 我正在使用垂直框和水平框并将它们嵌套(将一个放在另一个里面)。当我第一次开始时,这是一种制作简单格式化布局的简单方法。

  4. 我将标签和文本字段放在一个循环中,这样你就可以看到如何在一个循环中制作多个组件并仍然对它们进行布局。

  5. 我更改了您的几个变量名称以符合 Java 编码约定(对局部变量和字段使用小写)。

  6. 第一次显示 window 我添加了一个更常规的序列。

  7. 我还在事件调度线程上启动了您的 Swing 代码。您应该为所有 Swing 代码执行此操作。

轻微测试:

package Whosebug;

import java.util.*;
import javax.swing.*;


public class BasicWindow {

   private ArrayList<String> userNames = new ArrayList<>();
   private ArrayList<String> passwords = new ArrayList<>();

   public void registerUser() {
      JFrame register = new JFrame( "Register" );
      JPanel panel = new JPanel();
      Box vbox = Box.createVerticalBox();
      
      for( int i = 0; i < 4; i++ ) {
         Box hbox = Box.createHorizontalBox();
         JLabel username = new JLabel( "Username: " );
         hbox.add( username );
         JTextField input = new JTextField( 25 );
         hbox.add( input );
         vbox.add( hbox );
      }
      panel.add( vbox );
      register.add( panel );
      register.setSize( 500, 500 );
      register.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
      register.setLocationRelativeTo( null );  // center on screen
      register.setVisible( true );
   }

   public static void main( String[] args ) {
      SwingUtilities.invokeLater( new Runnable() {
         @Override
         public void run() {
            BasicWindow example = new BasicWindow();
            example.registerUser();
         }
      });
   }
}