gpt4 book ai didi

java - JFrame Layout set to null 问题

转载 作者:行者123 更新时间:2023-11-29 03:20:48 25 4
gpt4 key购买 nike

我正在尝试从我刚拿到的一本书中学习 GUI,但我遇到了很多问题(附上我的代码)。当我启动这个应用程序时,我得到的只是一个每次都需要扩展的最小窗口,它唯一显示的是我的一个单选按钮。我显然在这里做错了什么。有人可以给我建议吗?


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class CarPayment
{

public static void main(String[] args)
{
new CarPaymentCalc();
} // main
} // CarPayment

class CarPaymentCalc extends JFrame
{
private JLabel labelTitle, labelInterest, labelLoan;
private JTextField tfLoan, tfInterest, tfAnswer;
private ButtonGroup bgSelect;
private JRadioButton rbPmts36, rbPmts48, rbPmts60;
private JButton bClear;

public CarPaymentCalc()
{
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null); // Centers the window
setTitle("Car Payments Calculator");

// Labels
labelTitle = new JLabel("Calculate My Car Payment");
labelTitle.setVerticalAlignment(JLabel.TOP);
add(labelTitle, JLabel.CENTER);

labelLoan = new JLabel("Loan Amount");
labelLoan.setLocation(0, 10);
add(labelLoan);

labelInterest = new JLabel("Interest");
labelInterest.setLocation(0, 45);
add(labelInterest);

// Input Fields
tfLoan = new JTextField(20);
tfLoan.setLocation(0, 25);
add(tfLoan);

tfInterest = new JTextField(5);
tfInterest.setLocation(0, 60);
add(tfInterest);

JTextArea tfAnswer = new JTextArea(50,10);
tfAnswer.setLocation(0, 110);
add(tfAnswer);

// Radio buttons
bgSelect = new ButtonGroup();

rbPmts36 = new JRadioButton();
rbPmts36.setText("36 Payments");
rbPmts36.setLocation(0, 80);
bgSelect.add(rbPmts36);
add(rbPmts36);

bgSelect.add(rbPmts48);
rbPmts48.setText("48 Payments");
rbPmts48.setLocation(150, 80);
rbPmts48 = new JRadioButton();
add(rbPmts48);

bgSelect.add(rbPmts60);
rbPmts60.setText("60 Payments");
rbPmts60.setLocation(300, 80);
rbPmts60 = new JRadioButton();
add(rbPmts60);

setLayout(null);
pack();
} // CarPaymentCalc
}

最佳答案

不要使用null 布局。像素完美布局是现代 UI 设计中的一种错觉,您无法控制字体、DPI、渲染管道或其他会改变组件在屏幕上呈现方式的因素。

Swing 旨在与布局管理器一起克服这些问题。如果您坚持忽略这些特性并违背 API 设计,请准备好面对很多令人头疼的事情和永无休止的艰苦工作。

通过查看 JavaDocs for pack ...

Causes this Window to be sized to fit the preferred size and layouts of its subcomponents. The resulting width and height of the window are automatically enlarged if either of dimensions is less than the minimum size as specified by the previous call to the setMinimumSize method.

If the window and/or its owner are not displayable yet, both of them are made displayable before calculating the preferred size. The Window is validated after its size is being calculated.

您会注意到 pack 依赖布局管理器 API 来确定框架内容的首选可视大小。通过将布局管理器设置为 null,您可以阻止它确定此信息,所以基本上,它什么都不做。

如果您的书告诉您使用 null 布局,请摆脱它,它不会教您良好的习惯或做法。

看看Laying Out Components Within a Container有关布局管理器及其使用方法的更多详细信息

您遇到的其他问题:

在您完成构建 UI 之前调用 setVisible(true); 有时会阻止 UI 以您预期的方式出现。您可以在框架上调用 revalidate,但最后调用 setVisible 会更简单。

setLocationRelativeTo 使用的计算使用帧的当前大小,但这尚未设置。相反,你应该这样做:

public CarPaymentCalc() {
//...build UI here with appropriate layout managers...

pack();
setLocationRelativeTo(null);
setVisible(true);
}

我也不鼓励您直接从顶级容器(如 JFrame)扩展,除了您没有向框架本身 添加任何功能之外,它会阻止您以后重新使用 IU。

最好从 JPanel 开始,然后将其添加到您想要的任何内容,但那只是我。

关于java - JFrame Layout set to null 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23729187/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com