【问题标题】:JTextField Does not show up initially, only when clicking on it?JTextField 最初不显示,仅在单击时显示?
【发布时间】:2014-05-22 18:28:07
【问题描述】:

所以这个问题真的让我很头疼,因为昨晚我在处理它时出于某种原因,我的代码运行完美,我的文本字段会毫无问题地显示出来......

上床睡觉,起床,又到了工作的时候了 aaaaaand bam。现在我的 JtextFields 仅在我突出显示它们或单击它们或其他东西时才会显示...我想知道可能出了什么问题?

我的代码在这一点上真的很混乱和蹩脚,而我想出了一个更好的方法来设计我的程序......

我认为这只是 eclipse,但 netbeans 给了我同样的问题。

import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.awt.*;
import javax.swing.border.*;


public class DiffuserCalc {
    //create the class data fields
    private double Qts;
    private double Qes;
    private double Vas;
    JFrame ProgramBounds = new JFrame();
    JLabel label1= new JLabel("Qts");
    JLabel label2= new JLabel("Qes");
    JLabel label3= new JLabel("Fs");
    JLabel label4= new JLabel("BL");
    JLabel label5= new JLabel("Xmax");
    JLabel label6= new JLabel("Fs");
    JLabel label7= new JLabel("Vas");
    JLabel label8= new JLabel("Diameter");
    JLabel label9= new JLabel("Pmax (RMS)"); 
    JTextField QtsParam = new JTextField("Value");
    JTextField QesParam = new JTextField("Value");
    JTextField FsParam = new JTextField("   ");
    JTextField BLParam = new JTextField("   ");
    JTextField XmaxParam = new JTextField("   ");

    Font myFont = new Font("Tahoma", Font.BOLD, 20);

    DiffuserCalc()
    {
        ProgramBounds.setTitle("Box Designer");
        JPanel ParameterMenu = new JPanel();
        JPanel FieldInputs = new JPanel();


        ParameterMenu.setBounds(30, 0, 1180, 120);
        FieldInputs.setBounds(0,0, 1280, 720);
        ProgramBounds.add(ParameterMenu);
        ProgramBounds.add(FieldInputs);
        ProgramBounds.setSize(1280,720);



        // LAYOUT

        ParameterMenu.setLayout(new FlowLayout(FlowLayout.CENTER, 60, 10));

        FieldInputs.setLayout(null);

        Border lineBdr = BorderFactory.createLineBorder(Color.BLACK);
        Border BlackBorder = BorderFactory.createTitledBorder(lineBdr, "    T/S Parameters    ", TitledBorder.CENTER, TitledBorder.TOP, myFont, Color.black);

        //FIELD PROPERTIES

        label1.setFont(myFont);
        label2.setFont(myFont);
        label3.setFont(myFont);
        label4.setFont(myFont);
        label5.setFont(myFont);
        label6.setFont(myFont);
        label7.setFont(myFont);
        label8.setFont(myFont);
        label9.setFont(myFont);

        // PARAMETER BOUNDS
        int XLoc = 150;
        int YLoc = 70;
        QtsParam.setBounds(XLoc, YLoc, 40, 20);
        QesParam.setBounds(XLoc+95, YLoc, 40, 20);
        FsParam.setBounds(XLoc+190, YLoc, 40, 20);



        // ADD FIELDS
        ParameterMenu.add(label1);
        ParameterMenu.add(label2);
        ParameterMenu.add(label3);
        ParameterMenu.add(label4);
        ParameterMenu.add(label5);
        ParameterMenu.add(label6);
        ParameterMenu.add(label7);
        ParameterMenu.add(label8);
        ParameterMenu.add(label9);

        ParameterMenu.setBorder(BlackBorder);

        FieldInputs.add(QtsParam);
        FieldInputs.add(QesParam);
        FieldInputs.add(FsParam);
        FieldInputs.add(BLParam);
        FieldInputs.add(XmaxParam);




        // set everything proper
        QtsParam.requestFocus();
        ParameterMenu.setVisible(true);
        FieldInputs.setVisible(true);
        ProgramBounds.setVisible(true);
    }
    public double BoxDimension(int x, int y)
    {
        return x;
    }
    public static void main(String[] args) {

        DiffuserCalc MainProgram = new DiffuserCalc();


    }

}

【问题讨论】:

  • Java GUI 可能必须在多个平台、不同的屏幕分辨率和使用不同的 PLAF 上工作。因此,它们不利于组件的精确放置。要为强大的 GUI 组织组件,请改用布局管理器或 combinations of them,以及 white space 的布局填充和边框。

标签: java swing jtextfield


【解决方案1】:

您的代码仅设置了 3 个文本字段的边界,但您向面板添加了 5 个文本字段。

不要使用空布局!!!

使用合适的布局管理器,你就不用担心犯这样的错误了。

此外,请遵循 Java 命名约定。变量名不以大写字符开头。

【讨论】:

  • 好吧,我只添加了其中的 3 个,因为我是一个一个地添加它们来设置位置。我不使用布局管理器的原因是因为我的程序中非常奇怪的地方会有文本字段,因为它是一种计算器。即使使用布局管理器,我仍然会遇到完全相同的问题。
  • 其实我修好了,结果我的 jpanels 互相干扰了
  • Actually, i fixed it, turns out my jpanels were interfering with one another - 因为您使用的是空布局。那不是解决办法。以设计使用的方式使用 Swig。那就是使用布局管理器!
  • 是的,我扔掉了 null 并改用了 gridbag 布局。抱歉,我对此很陌生。
  • @TheGoatHerder,那么你应该接受答案,这样人们就知道问题已经解决了。
【解决方案2】:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.ComponentOrientation;
import java.awt.FlowLayout;
import java.awt.Font;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.Border;
import javax.swing.border.TitledBorder;


public class DiffuserCalc {
    //create the class data fields
    private double qts;
    private double qes;
    private double vas;
    private JFrame programBounds = new JFrame();
    private JLabel label1= new JLabel("Qts");
    private JLabel label2= new JLabel("Qes");
    private JLabel label3= new JLabel("Fs");
    private JLabel label4= new JLabel("BL");
    private JLabel label5= new JLabel("Xmax");
    private JLabel label6= new JLabel("Fs");
    private JLabel label7= new JLabel("Vas");
    private JLabel label8= new JLabel("Diameter");
    private JLabel label9= new JLabel("Pmax (RMS)"); 
    private JTextField qtsParam = new JTextField("Value");
    private JTextField qesParam = new JTextField("Value");
    private JTextField fsParam = new JTextField("");
    private JTextField bLParam = new JTextField("");
    private JTextField xmaxParam = new JTextField("");

    private Font myFont = new Font("Tahoma", Font.BOLD, 20);

    DiffuserCalc()
    {
        programBounds.setTitle("Box Designer");
        JPanel parameterMenu = new JPanel();
        JPanel labelPanel = new JPanel();
        JPanel fieldInputs = new JPanel();

        // LAYOUT
        programBounds.setLayout(new BorderLayout());
        parameterMenu.setLayout(new BorderLayout());
        fieldInputs.setLayout(new FlowLayout(FlowLayout.LEFT));
        fieldInputs.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
        labelPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
        labelPanel.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);


        programBounds.add(parameterMenu, BorderLayout.NORTH);
        parameterMenu.add(labelPanel, BorderLayout.NORTH);
        parameterMenu.add(fieldInputs, BorderLayout.SOUTH);
//        programBounds.add(fieldInputs);
        programBounds.setSize(1280,720);

        Border lineBdr = BorderFactory.createLineBorder(Color.BLACK);
        Border BlackBorder = BorderFactory.createTitledBorder(lineBdr, "    T/S Parameters    ", TitledBorder.CENTER, TitledBorder.TOP, myFont, Color.black);

        //FIELD PROPERTIES
        label1.setFont(myFont);
        label2.setFont(myFont);
        label3.setFont(myFont);
        label4.setFont(myFont);
        label5.setFont(myFont);
        label6.setFont(myFont);
        label7.setFont(myFont);
        label8.setFont(myFont);
        label9.setFont(myFont);

        // ADD FIELDS
        labelPanel.add(label1);
        labelPanel.add(label2);
        labelPanel.add(label3);
        labelPanel.add(label4);
        labelPanel.add(label5);
        labelPanel.add(label6);
        labelPanel.add(label7);
        labelPanel.add(label8);
        labelPanel.add(label9);

        parameterMenu.setBorder(BlackBorder);

        qtsParam.setColumns(3);
        fieldInputs.add(qtsParam);
        qesParam.setColumns(3);
        fieldInputs.add(qesParam);
        fsParam.setColumns(2);
        fieldInputs.add(fsParam);
        bLParam.setColumns(2);
        fieldInputs.add(bLParam);
        xmaxParam.setColumns(2);
        fieldInputs.add(xmaxParam);

        // set everything proper
        qtsParam.requestFocus();
        programBounds.pack();
        programBounds.setVisible(true);
    }
    public double BoxDimension(int x, int y)
    {
        return x;
    }
    public static void main(String[] args) {

        DiffuserCalc MainProgram = new DiffuserCalc();


    }
}

所以我重写了这个类,让你更符合 Java style standard。接下来不使用布局管理器是自找麻烦。即使您的要求与您所说的一样,最好还是努力使用布局管理器,因为您将不断遇到此类问题。阅读有关布局管理器的更多信息here。此外,不要在您添加到框架的 JPanel 上调用 setVisible。当您在 JFrame 上调用 setVisible 时,它​​将在其所有子组件上调用 setVisible。

接下来调用 JTextField 上的 setColumns 方法,而不是使用空格对其进行初始化,以获得更一致和可预测的行为。

【讨论】:

  • 好吧,很酷,我对此一无所知。我知道不使用布局管理器很糟糕,但不幸的是,这是我在课堂上学到的唯一方法。谢谢你的回复。我通过为我的组件使用 GridBagLayout 来修复它
  • Furthermore don't call setVisible on JPanels 正确,因为默认情况下所有 Swing 组件(顶级容器除外)都是可见的。 When you call setVisible on the JFrame it will call setVisible on all of it child components. - 不会。 Swing 组件默认可见。
猜你喜欢
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 2019-10-04
  • 1970-01-01
  • 2021-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多