java - 为什么在构造的 JPanel 中表达了组件的某些属性,而没有表达其他属性?

标签 java swing jframe jpanel

我正在开始一个程序,在其中构造一个 JFrame 并使用我创建的另一个名为 StartPanel 的类向其中添加一个 JPanel。当 JPanel 构造时,它会添加 StartPanel 类中定义的 JLabel。然后将该面板添加到 JFrame。标签的某些属性在 GUI 中表达(它将自身添加到面板中,可以在其上添加红色边框,可以更改文本),但有些属性则不然。例如,我无法更改标签的位置或大小。

到目前为止,我读到的有关该问题的所有内容(我认为)都同意我的方法,或者还没有澄清太多。此外,我还向 StartPanel 和标签添加了边框,以可视化问题并确认标签没有改变其大小。我无法调整标签的大小或位置属性。如何解决这个问题并控制标签的属性?

此外,我知道我可以通过不通过单独的类构造面板并在同一函数中声明标签来规避整个问题。然而,这个项目将相当大,所以我更希望有一个类系统,我可以根据需要构建一个面板。

编码时间:

我使用类构造框架和面板的位置:

public class StartFrame {

    public StartFrame() {
        JFrame frame = new JFrame("Constuctor tests");
        frame.setSize(800, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

        JPanel startPanel = new StartPanel();  //This is where I construct the panel
        startPanel.setVisible(true);
        startPanel.setBorder(BorderFactory.createLineBorder(Color.blue)); //Visualize the panel
        frame.add(startPanel);

    }

}

StartPanel 类:

public class StartPanel extends JPanel {

    public StartPanel() {
        JLabel label = new JLabel("This is a label");
        label.setLocation(100, 100); //It is not at 100,100
        label.setSize(200, 100); //It is not a box this large
        label.setBorder(BorderFactory.createLineBorder(Color.red)); //Done as to visualize it
        label.setVisible(true);
        add(label);

    }
}

最后是产品图片: The final product

非常感谢您的帮助!

最佳答案

您可以通过布局管理器控制元素的大小和布局。您可以阅读all about it here

为了帮助您开始,让我们看看为什么您的屏幕看起来像这样。

JFrame 的默认布局是 BorderLayout。 BorderLayout 获取它的第一个子级(在本例中为 JPanel),将其放置在中心并拉伸(stretch)它以占据容器(在本例中为 JFrame)的整个宽度。这就是 StartPanel 占据 JFrame 整个大小的原因。 Here you can read more about how to use the border layout.

JPanel 的默认布局是 FlowLayout。在流布局中,每个子元素(在本例中为 JLabel)都添加到中心顶部。添加更多子项时,它们会并排添加到同一行中。 FlowLayout 允许其子级占据它们想要的大小。在这种情况下,JLable 仅需要一个小矩形来显示文本,因此这就是 JLabel 的大小。 Go here to learn more about the FlowLayout.

关于java - 为什么在构造的 JPanel 中表达了组件的某些属性,而没有表达其他属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61164038/

相关文章:

java - JFrame 在 thread.sleep() 之前未更新

java - CardLayout 与手动添加/删除 JPanel 有什么特别之处?

Java 图形、图形面板和按钮面板

java - 子类中的 JPanel 未正确添加到驱动程序 JFrame

java - Android:如何在首选项上设置 OnPreferenceClickListener?

java - 默认情况下,时间戳是否出现在 HBase 表中?

java - 从文本文件中读取错误字符

java - 如何在不移动鼠标的情况下使用 Swing 中的 mouseEnter() 方法进行更新?

java - 我们可以在不使用NDK的情况下在Android Studio中执行C程序吗?

java - 为什么 JFrame 背景图像不起作用?