java - 为什么在构造的 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);
}
}
最后,产品图片: 最终产品
非常感谢你的帮助!
解决方案
您可以通过布局管理器控制元素的大小和布局。您可以在此处阅读所有相关信息。
为了让您入门,让我们来看看为什么您的屏幕看起来像这样。
JFrame 的默认布局是 BorderLayout。BorderLayout 采用它的第一个子项(在本例中为 JPanel),将其放置在中心并拉伸它以占据容器的整个宽度(在本例中为 JFrame)。这就是为什么您的 StartPanel 占据了整个 JFrame 大小的原因。在这里,您可以阅读有关如何使用边框布局的更多信息。
JPanel 的默认布局是 FlowLayout。在流布局中,每个子元素(在本例中为 JLabel)都被添加到中心顶部。当添加更多孩子时,它们会在一行中彼此相邻添加。FlowLayout 允许其子级占用他们想要的大小。在这种情况下,JLable 只需要一个小矩形来显示文本,这就是 JLabel 的大小。转到此处了解有关 FlowLayout 的更多信息。
推荐阅读
- regex - 此搜索和替换分析规则是否将 URL 修剪为仅根域?
- javascript - FormGroup FormArray - 按名称仅删除一个元素对象。角
- python - Matplotlib - 没有显式鼠标点击关闭窗口
- python - 熊猫数据框:删除第二个即将到来的相同值
- dialogflow-es - Dialogflow 对话模式掉线了?
- c# - 如何一起使用 HttpClient 进行基本身份验证和 API 密钥标头
- laravel-5 - 如果是多态的,有什么方法可以获得所有订单的关系?
- r-markdown - 如何打印出由 rmarkdown 生成的页面的所有选项卡?
- kivy - kivy 启动器应用程序源代码的可用性
- unit-testing - 如何为一小时后的函数返回时间编写单元测试