【问题标题】:Sometimes swing text field appears sometimes it doesn't?有时摆动文本字段出现有时它不出现?
【发布时间】:2016-09-25 15:13:07
【问题描述】:

我有一段代码有时运行良好,有时却不能。我实际上并没有改变任何东西,但有时文本字段会出现,有时它不会出现。代码怎么可能每次都以不同的方式运行?对我来说完全是无稽之谈。我对 Java 相当陌生,但我当然不认为这是可能的......

如果有人可以帮助我,您能否提供修复程序,以及为什么会发生这种情况?因为我想完全理解这个问题。

这是我的代码:

import javax.swing.*;

public class Window {
    JFrame frame;
    JPanel panel;

    public Window(int x, int y, String t, boolean isHomePage){

        int xSize = x;
        int ySize = y;
        String title = t;

        frame = new JFrame();
        frame.setSize(xSize, ySize);
        frame.setLocationRelativeTo(null);
        frame.setTitle(title);
        frame.setVisible(true);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        panel = new JPanel();
        frame.add(panel);
        panel.setLayout(null);
        panel.setVisible(true);

        if (isHomePage){
            homePage();
        }


    }

    public void homePage(){

        JLabel usernameLabel = new JLabel();
        usernameLabel.setText("Please enter your username:");
        usernameLabel.setBounds(0,100,300,20);
        panel.add(usernameLabel);
        usernameLabel.setVisible(true);

        JTextField textbox = new JTextField();
        textbox.setVisible(true);
        textbox.setBounds(280,100,400,20);
        panel.add(textbox);

    }


}

【问题讨论】:

  • 使用布局管理器

标签: java swing jframe jlabel jtextfield


【解决方案1】:

正如雷默斯所说——

  1. 使用布局管理器而不是空布局。虽然空布局和setBounds() 对于 Swing 新手来说似乎是创建复杂 GUI 的最简单和最好的方法,但创建的 Swing GUI 越多,使用它们时遇到的困难就越严重。当 GUI 调整大小时,它们不会调整您的组件大小,它们是增强或维护的皇家女巫,放置在滚动窗格中时它们完全失败,在与原始不同的所有平台或屏幕分辨率上查看时它们看起来很糟糕.
  2. 将所有组件添加到 GUI 之后,而不是之前,在 JFrame 上调用 setVisible(true)

请注意,您对 setVisible(true) 的工作原理感到困惑。是的,您在子组件上调用它,但默认情况下它们已经将其可见属性设为 true,因此在子组件上调用它没有任何效果。您的问题是当您在 JFrame 上调用 setVisible 时。您在添加带有文本字段的 JPanel 之前调用它,因此这将导致它偶尔出现。为自己证明。如果 texzt 字段不可见,则最小化并恢复您的 GUI,它现在应该显示。

我自己,如果我想像您在上面尝试做的那样交换视图,我会使用CardLayout

【讨论】:

  • 好的,我明白了。但是你能解释一下为什么它有时可以工作,但有时不能吗?当然,如果它是一套代码,它应该每次都完全相同吗?
  • @Cutter:这是因为您对setVisible(true) 的工作方式感到困惑。是的,您在子组件上调用它,但默认情况下它们已经将其可见属性设为 true,因此在子组件上调用它没有任何效果。您的问题是当您在 JFrame 上调用 setVisible 时。您在 before 添加带有文本字段的 JPanel 之前调用它,因此这将导致它偶尔出现。为自己证明。如果 texzt 字段不可见,则最小化并恢复您的 GUI,它现在应该会显示。
猜你喜欢
  • 1970-01-01
  • 2017-01-29
  • 1970-01-01
  • 1970-01-01
  • 2018-01-11
  • 2014-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多