【问题标题】:JPanel doesn't add button and text fieldJPanel 不添加按钮和文本字段
【发布时间】:2017-08-08 22:18:21
【问题描述】:

我不明白为什么我编译程序时没有出现panel.add(txtnum1)panel.add(button2)panel.add(button) 工作正常,我的编译器没有抛出任何警告或错误,我错过了什么吗?

package gui;

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

public class GUI {
 public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setVisible(true);
    frame.setSize(new Dimension(300, 500));
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel panel = new JPanel();
    panel.setBackground(Color.GRAY);
    frame.getContentPane().add(panel);
    JButton button = new JButton("Submit");
    panel.add(button);

    JTextField txtnum1 = new JTextField();
    txtnum1.setPreferredSize(new Dimension(30, 50));
    panel.add(txtnum1);

    JButton button2 = new JButton("Clear");
    panel.add(button2);
 }

}

【问题讨论】:

  • 其他组件可能已添加到面板中而无法查看。您应该通过使用布局管理器而不是设置绝对位置和大小来控制组件的显示方式。
  • JTextField txtnum1 = new JTextField(); txtnum1.setPreferredSize(new Dimension(30, 50)); 文本字段的大小应使用setColumns(int) 设置字符宽度,setFont(bigOrSmallFont) 更改高度(和宽度)。
  • “我的编译器没有抛出任何警告或错误,是我遗漏了什么吗?” 编译器不会发现很多运行时可能出错的东西。摒弃编译OK就没有bug的观念。

标签: java swing jpanel awt


【解决方案1】:

在使用 Swing 实现 GUI 应用程序时,我喜欢在构建 JFrame 的代码中使用这种方法(我们假设一个简单的 GUI,在 JPanel 容器和类似的东西中没有 JPanel 容器):

  1. 创建JFrame并初始化它
  2. 创建JPanel
  3. 为该面板创建 GUI 组件并添加它们
  4. JFrame 内的每个JPanel 添加面板到JFrame(重复2)
  5. 使JFrame 在屏幕上可见

因此,您的代码将如下所示:

package gui;

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

public class GUI {
 public static void main(String[] args) {
    /* step 1 */
    JFrame frame = new JFrame();
    frame.setSize(new Dimension(300, 500));
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    /* step 2 */
    JPanel panel = new JPanel();
    panel.setBackground(Color.GRAY);

    /* step 3 */
    JButton button = new JButton("Submit");
    panel.add(button);

    JTextField txtnum1 = new JTextField();
    txtnum1.setPreferredSize(new Dimension(30, 50));
    panel.add(txtnum1);

    JButton button2 = new JButton("Clear");
    panel.add(button2);

    /* step 4 */
    frame.getContentPane().add(panel);
    /* step 5 */
    frame.setVisible(true);
 }

}

经过测试,可以在 Eclipse 中运行。

【讨论】:

    【解决方案2】:

    在添加完所有组件后,您应该在最后调用 setVisible(true)。

    frame.setVisible(true);放在最后,它会按预期工作。

    【讨论】:

      猜你喜欢
      • 2016-01-12
      • 2015-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多