【问题标题】:Put a JTextfield on a JPanel?将 JTextfield 放在 JPanel 上?
【发布时间】:2014-04-10 00:12:24
【问题描述】:

为什么文本字段没有出现在我框架内的面板上? 我的意思是是否需要一些额外的操作来制作面板的组件 可见吗?

希望有人能帮帮我....

public class example1  {

    public static void main(String[] args) {

    JFrame tt=new TT();
    }
}
class TT extends JFrame {

    JTextField textField;
    JPanel panel;
    JButton button1;
    JButton button2;

    public TT() {
        setSize(300, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setTitle("Bla Blubb");
        setResizable(false);
        setLayout(null);

        panel=new JPanel();
        panel.setBounds(5, 5, 290, 290);
        add(panel);

        textField=new JTextField();
        textField.setBounds(5, 5, 280, 50);
        panel.add(textField);

            setVisible(true);

      }
}

【问题讨论】:

  • setLayout(null); 1) Java GUI 可能必须在多个平台、不同的屏幕分辨率和使用不同的 PLAF 上工作。因此,它们不利于组件的精确放置。要为强大的 GUI 组织组件,请改用布局管理器或 combinations of them,以及 white space 的布局填充和边框。 2) 提供 GUI 的 ASCII 艺术(或带有简单绘图的图像),因为它应该以最小尺寸出现,并且(如果可调整大小)具有额外的宽度/高度。
  • 我知道 layoutmanager 更好,它只用于培训......但是我不明白为什么面板上的文本字段没有出现。从我的角度来看,j已经以正确的方式做出了一切......
  • “仅用于培训。” 如果此培训是“为什么我们不应该使用空布局”,那么您已经完成了部分培训。如果是“如何制作具有空布局的 GUI”,那是困难且毫无意义的。
  • “仅用于训练。”。通过与布局管理器进行培训来帮助自己。从Laying out Components in a Container开始

标签: java swing jpanel layout-manager null-layout-manager


【解决方案1】:

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

class TT extends JFrame {

    JTextField textField;
    JPanel panel;
    JButton button1;
    JButton button2;

    public TT() {
        //setSize(300, 300);  // better to use pack() (after components added)
        //setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  // better to use
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        //setLocationRelativeTo(null);  // better to use..
        setLocationByPlatform(true);
        setTitle("Bla Blubb");
        setResizable(false);
        //setLayout(null); // better to use layouts with padding & borders

        // set a flow layout with large hgap and vgap.
        panel = new JPanel(new FlowLayout(SwingConstants.LEADING, 10, 10));
        // panel.setBounds(5, 5, 290, 290); // better to pack()
        add(panel);

        //textField = new JTextField(); // suggest a size in columns
        textField = new JTextField(8);
        //textField.setBounds(5, 5, 280, 50); // to get height, set large font
        textField.setFont(textField.getFont().deriveFont(50f));
        panel.add(textField);

        pack(); // make the GUI the minimum size needed to display the content
        setVisible(true);
    }

    public static void main(String[] args) {
        // GUIS should be constructed on the EDT.
        JFrame tt = new TT();
    }
}

【讨论】:

  • +1 很好的答案,但如果他仍然想使用空布局,我认为他的问题是他没有建议列中的大小
  • @nachokk "如果他仍然想使用空布局.." ..他失去了我的帮助,因为我没有时间或耐心来解决null 布局存在无数问题。
  • 好的,只有两件事...你必须确保在 EDT 中使用 invokeLater 执行,并且在这种情况下根本不需要扩展 JFrame
  • @nachokk 我顺便提到了第一点,虽然我没有更正那部分(懒惰)。第二部分的好点,我忘了提。如果使用按钮,我们通常只是创建一个按钮而不是扩展它。这同样适用于JFrame。扩展框架的唯一时间是添加功能时。在最后 1000 个基于帧的应用程序中。我已经看到,标准框架中添加了 0 个功能。
  • 这是 netbeans mattisse 事实上的创建 jframe 的方式
猜你喜欢
  • 1970-01-01
  • 2013-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-05
  • 2016-08-29
相关资源
最近更新 更多