首页 > 解决方案 > 为什么在构造的 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);

    }
}

最后,产品图片: 最终产品

非常感谢你的帮助!

标签: javaswingjframejpanel

解决方案


您可以通过布局管理器控制元素的大小和布局。您可以在此处阅读所有相关信息

为了让您入门,让我们来看看为什么您的屏幕看起来像这样。

JFrame 的默认布局是 BorderLayout。BorderLayout 采用它的第一个子项(在本例中为 JPanel),将其放置在中心并拉伸它以占据容器的整个宽度(在本例中为 JFrame)。这就是为什么您的 StartPanel 占据了整个 JFrame 大小的原因。在这里,您可以阅读有关如何使用边框布局的更多信息。

JPanel 的默认布局是 FlowLayout。在流布局中,每个子元素(在本例中为 JLabel)都被添加到中心顶部。当添加更多孩子时,它们会在一行中彼此相邻添加。FlowLayout 允许其子级占用他们想要的大小。在这种情况下,JLable 只需要一个小矩形来显示文本,这就是 JLabel 的大小。转到此处了解有关 FlowLayout 的更多信息。


推荐阅读