java - 无法让 JLabel 从头开始​​切换到 GUI

标签 java swing user-interface awt layout-manager

我正在为一个小型爱好项目学习 GUI 的基础知识,并且一直在学习从头开始编写 GUI 代码。我有初始设置和变量等,但我遇到了问题。我似乎无法让我的 JLabel 类移动到面板的左侧。我知道有更简单的方法来编写 GUI 代码。我只是要获取 GUI 的最基本的声明。这是我的代码:

public class GUIGameFromScratch {
static String[] Classes = {
            "Barbarian",
            "Fighter",
            "Rogue",
            "Wizard"
        };
static String[] Races = {
            "Dwarf",
            "Gnome",
            "Half-Orc",
            "Human"
        };
static String[] Gender = {
            "Male",
            "Female"
        };
static String cls;
static String rcs;
static String gen;
static String gameName = "RPG Text";
static Component frame = null;
static Component icon = null;

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    Classes(Classes);
    Races(Races);
    Gender(Gender);
    JFrame display = new JFrame();
    display.setSize(300,250);
    display.setVisible(true);
    display.setTitle(gameName);
    display.setResizable(false);
    JPanel disPane = new JPanel();
    display.add(disPane);
    disPane.setVisible(true);
    disPane.setSize(295,245);
    JLabel clas = new JLabel();
    disPane.add(clas);
    clas.setVisible(true);
    clas.setLocation(5,5);
    clas.setSize(100,50);
    clas.setText("Class: " + cls);
}

public static void Classes(String[] Classes){
    cls = (String)JOptionPane.showInputDialog(frame,
            "Choose a Class:",
            gameName,
            JOptionPane.PLAIN_MESSAGE, (Icon) icon,
            Classes,
            Classes[0]
    );
}

public static void Races(String[] Races){
    rcs = (String)JOptionPane.showInputDialog(frame,
            "Choose a Race:",
            gameName,
            JOptionPane.PLAIN_MESSAGE, (Icon) icon,
            Races,
            Races[0]
    );
}

public static void Gender(String[] Gender){
    gen = (String)JOptionPane.showInputDialog(frame,
            "Choose a Gender:",
            gameName,
            JOptionPane.PLAIN_MESSAGE, (Icon) icon,
            Gender,
            Gender[0]
    );
}
}

我不完全确定如何解决这个问题。我需要能够移动标签来刷新我的 GUI,但似乎没有任何效果。我已经尝试过位置、区域设置、水平对齐等。一定有一些功能我缺少但我还没有找到。我再次明白,我对此采取了非常严格的态度。任何帮助将不胜感激。

最佳答案

Swing/AWT 使用布局管理器显示子组件。每个容器(例如 JPanel)都有一个布局管理器。

布局管理器的工作是设置每个子组件的位置和大小。当父级的布局管理器布置其子级并确定其位置和大小时,调用 setLocation 时传递的任何值都将被丢弃。

最简单的解决方案是指定一个布局管理器,将其子组件放置在左侧:

JPanel disPane = new JPanel(new FlowLayout(FlowLayout.LEFT));

我确信您计划在窗口中添加更多组件。如果您希望它们以更复杂的方式布局,您可能需要更复杂的布局管理器,或者许多布局管理器的组合。在彼此内部使用多个 JPanel 是很常见的,每个 JPanel 都有自己的布局管理器。例如,如果您需要一排相同大小的按钮,您可以使用 GridLayout对于仅包含这些按钮的单独 JPanel。

浏览文档以查看可用的布局管理器很有用:

在我看来,最有用的布局管理器是 GridBagLayout (不要与 GridLayout 混淆)。它很难学习,主要是因为布局组件可能是一个复杂的问题,但是一旦您完全理解它,它就会变得非常有用并且非常容易使用。

其他一些常用的布局是:

但是没有一个布局管理器可以解决所有问题,这就是为什么程序员需要组合和嵌套它们。

调整大小

正如布局管理器控制子组件的位置一样,它也可以控制它们的大小。

您当前将 JLabel 的大小设置为 100×50 像素。我确信它在您的计算机上看起来很好。

但是 Java 被设计为可以在许多计算机和许多操作系统上运行。如果您的 JLabel 字体是 12 点 Lucida,那么 JLabel 需要多少像素高? “12 点”字体的高度不是 12 像素; 12 点实际上是 1272 英寸。到底需要多少像素来对应该测量取决于用户的显示器和当前的图形分辨率。

理论上,您可以自己进行所有数学计算来确定 JLabel 需要多大,但您不需要这样做,因为 Swing 已经这样做了。 JLabel 的 preferred size已经说明了这一点。

只需根本不设置 JLabel 的大小,父布局管理器将遵循其默认的首选大小,无论运行程序的计算机上适合什么大小。

关于java - 无法让 JLabel 从头开始​​切换到 GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51991659/

相关文章:

java - Android 文件访问问题

swing - JPA 桌面应用程序

java - Jdeveloper 12 支持创建 Swing 应用程序吗?

css - 可定制的CSS

java - VM初始化期间发生错误;无法加载 native 库:Can't find dependent libraries

java - 线程中的异常 "AWT-EventQueue-0"java.lang.NumberFormatException : For input string: "1 "

java - JFrame 关闭问题

android - 如何在 Android 测试用例中使用 jUnit 测试滑动/滑动事件

java - 从另一个类运行 GUI

java - 每次循环运行不同的方法