【问题标题】:What is the error in this jframe code这个jframe代码有什么错误
【发布时间】:2023-12-26 09:22:01
【问题描述】:

大家好,我正在尝试创建自己的计算器,但图形部分有问题... 我创建了一个标签和一个按钮,并将其设置在一个标签中。他们出现了,但我无法设置他们的位置有什么问题? 感谢帮助

import java.awt.Color;
import java.awt.Dimension;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class calc extends JFrame {

    public calc(String string) {

        this.setResizable(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle("calculator");
        this.setPreferredSize(new Dimension(300, 400));

        JButton button1 = new JButton("calculate");
        button1.setBackground(Color.cyan);
        button1.setLocation(200, 100);
        button1.setPreferredSize(new Dimension(100, 20));

        JLabel label1 = new JLabel();
        label1.setText(main.main.text); // main.main.text is a text in main class it works XD

        JPanel panel1 = new JPanel();
        panel1.add(label1);
        panel1.add(button1);
        panel1.setPreferredSize(new Dimension(300, 400));
        this.getContentPane().add(panel1);

        this.pack();
        panel1.setVisible(true);
        button1.setVisible(true);
        label1.setVisible(true);

    }
}

【问题讨论】:

  • 这里的main.main.text 是什么?也为此共享代码。使用适当的 getter 方法来访问它。
  • 您正在尝试设置添加到 JPanel 的组件的绝对位置,该 JPanel 默认使用 FlowLayout,而 FlowLayouts 不尊重绝对定位。空布局,做,但你应该避免使用空布局,因为这会导致非常不灵活的 GUI,虽然它们在一个平台上看起来不错,但在大多数其他平台或屏幕分辨率上看起来很糟糕,而且很难更新和维护。更好的解决方案:向我们展示您想要实现的目标的图片,或者更全面地描述您的 GUI 布局,我们将能够更好地帮助您解决问题。
  • Swing GUI 可能必须在不同的平台上工作,使用不同的 PLAF,在不同的屏幕尺寸和分辨率上使用不同的字体大小默认设置。因此,它们不利于组件的精确放置。而是使用布局管理器,或 combinations of layout managers 以及 layout padding and borders 用于空白。

标签: java swing jframe jpanel jbutton


【解决方案1】:

Swing 不允许您设置对象的位置,因为它使用layout managers 管理您的 GUI 布局。如果你真的想自己设置布局,你可以使用frame.getContentPane().setLayout(null);(或者在你的情况下getContentPane().setLayout(null),因为你的类已经扩展了JFrame

然后您可以使用setSizesetLocation 方法。然而,这是一个的想法。以下是 java 文档中关于 null layoutManagers 的说明:

虽然我们强烈建议您使用布局管理器,但您可以在没有它们的情况下执行布局。 通过将容器的布局属性设置为 null,您可以使容器不使用布局管理器 使用这种称为绝对定位的策略,您必须指定每个对象的大小和位置 该容器中的组件。绝对定位的一个缺点是它不能调整 当*容器调整大小时。它也不能很好地适应之间的差异 用户和系统,例如不同的字体大小和语言环境。

【讨论】:

  • 我认为提及null 布局会适得其反。只有专家应该尝试使用他们自己的逻辑来布局容器,然后它应该被封装在自定义布局管理器中。当这个人有足够的经验来布置 GUI 时,他们很可能已经听说过 null 布局。
  • 我只是提供回答问题的信息,操作员询问如何准确定位组件,我确实在答案中指出这是一个坏主意,他应该使用 LayoutManagers。
最近更新 更多