【问题标题】:JTextField not showing up in JPanel on launchJTextField 在启动时未显示在 JPanel 中
【发布时间】:2012-10-24 22:13:24
【问题描述】:

JTextField 之所以存在,是因为当我将鼠标移到应该是鼠标图标的位置时,鼠标图标会变为光标,然后当我单击它时就会出现。但它在启动时是不可见的。我错过了什么?

public class JavaSwingTextfield extends JFrame {
    private static final long serialVersionUID = 1L;

    JTextField myTextField;

    public JavaSwingTextfield(){

        /***** JFrame setup *****/

        // Set the size of the window
        setSize(600,600);

        // Make the application close when the X is clicked on the window
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        // Makes the JFrame visible to the user
        setVisible(true);

        /***** JFrame setup END *****/


        /***** JButton setup *****/

        // Create a JLabel and set its label to "Start"
        myTextField = new JTextField("Start");

        // Set the label's size
        myTextField.setSize(100, 50);

        // Put the label in a certain spot
        myTextField.setLocation(200, 50);

        // Set a font type for the label
        //Font myFont = new Font("Serif", Font.BOLD, 24);
        //myTextField.setFont(myFont);

        // Add the label to the JFrame
        add(myTextField);

        /***** JButton setup END *****/

    }


    /***** The main method *****/
    public static void main(String[] args){ 

        new JavaSwingTextfield();

    }

}

【问题讨论】:

  • 1) myTextField.setLocation(200, 50); 不要那样做。使用布局,请致电pack() 如果这不能解决问题,请发布SSCCE。 2) myTextField.setSize(100, 50); 也不要那样做。宽度可以通过Font 和列来建议。高度取自Font
  • @AVD 我在add(myTextField); 之前和之后调用了myTextField.setVisible(true);。什么都没有。

标签: java swing jpanel jtextfield layout-manager


【解决方案1】:
  • 使用Event Dispatch Thread 创建 GUI 组件
  • 在将所有组件添加到JFrame 之前不要调用setVisible(..)(这是上面的代码sn-ps 实际错误+1 到@Clark)
  • 不要不必要地扩展 JFrame
  • 不要调用setSize(..),而只是在设置JFrame可见之前调用JFrame#pack()
  • 不要在JTextField 上调用setSize(),而是查看它的构造函数:JTextField(String text,int columns)
  • 使用适当的LayoutManagers,有关示例,请参见此处:A Visual Guide to Layout Managers

这是我做的一个例子(基本上你的代码有修复):

import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class JavaSwingTextfield {

    private JTextField myTextField;

    public JavaSwingTextfield() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        myTextField = new JTextField("Start");
        
        // Add the label to the JFrame
        frame.add(myTextField);
        
        //pack frame to component preferred sizes
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        //Create UI on EDT
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new JavaSwingTextfield();
            }
        });
    }
}

【讨论】:

  • “不要不必要地扩展 JFrame 类”是什么意思?谢谢。
  • @tazboy 很高兴。你只扩展类来添加功能。
  • 我有误解或无知,为了创建 JFrame,我需要扩展类。但我想,就像股票类中没有的任何其他对象一样,我只需要导入它。你能给我一个我需要使用 JFrame 类进行扩展的理由吗?
  • @tazboy 如果您想向其添加新功能,例如这个问题stackoverflow.com/questions/13065032/…,其中 OP 希望仅在释放鼠标后才调整其 JFrame 的大小。
【解决方案2】:

您正在将JTextfield 添加到JFrame 之后,您已将JFrame 设为可见。只需事先添加JTextField

【讨论】:

  • “如果您不想这样做,请致电..” 这是解决更深层次问题的笨办法。
  • 确实如此。我会解决的。
  • 是的,我不知道您必须将所有组件添加到 JFrame 中,然后显示 JFrame。现在它出现了。现在我将不得不使用 Andrew Thompson 关于调整大小的建议,因为现在文本字段填满了整个窗口。
猜你喜欢
  • 2016-08-29
  • 1970-01-01
  • 1970-01-01
  • 2014-03-16
  • 1970-01-01
  • 1970-01-01
  • 2017-01-10
  • 2020-08-09
  • 1970-01-01
相关资源
最近更新 更多