【问题标题】:Java GUI window does not have any outputJava GUI 窗口没有任何输出
【发布时间】:2016-07-03 09:12:36
【问题描述】:

问候魔戒团契,

下面的任务已经在你身上了。

你的主的程序没有按照我的意愿在窗口上输出结果。

框架弹出,但面板不工作,因此没有显示任何按钮和控件。

这是你的使命, 你应该选择接受吗:

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

public class newAccount
{    

static JFrame bankFrame;
JButton buttonCreate;

// Panel Variable

static JPanel panelObject;

// Label Variables

JLabel labelName;
JLabel labelDOB;
JLabel labelGender;
JLabel labelAge;
JLabel labelPartner;
JLabel labelCountry;
JLabel labelCity;
JLabel labelAddress;
JLabel labelZipPostal;

// Data Entry Control Variables

JTextField textName;
JTextField textDOB;
JComboBox comboGender;
JTextField textAge;
JTextField textPartner;
JComboBox comboCountry;
JTextField textCity;
JTextField textAddress;
JTextField textZipPostal;

// Layout Variables

GridBagLayout gbObject;
GridBagConstraints gbc;

public void newAccount()
{
    // Initializing Laoyout Variables

    gbObject = new GridBagLayout();
    gbc = new GridBagConstraints();
    panelObject = new JPanel();
    panelObject.setLayout(gbObject);


    // Initializing Label Controls

    labelName = new JLabel ("Name");
    labelDOB = new JLabel ("Date of Birth");
    labelGender = new JLabel ("Gender");
    labelAge = new JLabel ("Age");
    labelPartner = new JLabel ("Partner");
    labelCountry = new JLabel ("Country");
    labelCity = new JLabel ("City");
    labelAddress = new JLabel ("Address");
    labelZipPostal = new JLabel ("Zip/Postal Code");

    // Data Entry Controls

    textName = new JTextField(50);
    textDOB = new JTextField(9);

    String packages[] = {"Male", "Female", "Other"};
    comboGender = new JComboBox (packages);

    textAge = new JTextField(3);
    textPartner = new JTextField(50);

    String packages1[] = {"Oman", "India", "United Arab Emirates", "United States of America", "United Kingdon"};
    comboCountry = new JComboBox (packages1);

    textCity = new JTextField(50);
    textAddress = new JTextField(100);
    textZipPostal = new JTextField(10);

    // Controls for Name

    gbc.anchor = GridBagConstraints.NORTHWEST;
    gbc.gridx = 1;
    gbc.gridy = 10;
    gbObject.setConstraints (labelName, gbc);
    panelObject.add (labelName);

    gbc.anchor = GridBagConstraints.NORTHWEST;
    gbc.gridx = 4;
    gbc.gridy = 10;
    gbObject.setConstraints (textName, gbc);
    panelObject.add (textName);

    // Controls for Date of Birth

    gbc.anchor = GridBagConstraints.NORTHWEST;
    gbc.gridx = 1;
    gbc.gridy = 30;
    gbObject.setConstraints (labelDOB, gbc);
    panelObject.add (labelDOB);

    gbc.anchor = GridBagConstraints.NORTHWEST;
    gbc.gridx = 4;
    gbc.gridy = 30;
    gbObject.setConstraints (textDOB, gbc);
    panelObject.add (textDOB);

    // Controls for Gender

    gbc.anchor = GridBagConstraints.NORTHWEST;
    gbc.gridx = 1;
    gbc.gridy = 50;
    gbObject.setConstraints (labelGender, gbc);
    panelObject.add (labelGender);

    gbc.anchor = GridBagConstraints.NORTHWEST;
    gbc.gridx = 4;
    gbc.gridy = 50;
    gbObject.setConstraints (comboGender, gbc);
    panelObject.add (comboGender);

    // Controls for Age

    gbc.anchor = GridBagConstraints.NORTHWEST;
    gbc.gridx = 1;
    gbc.gridy = 70;
    gbObject.setConstraints (labelAge, gbc);
    panelObject.add (labelAge);

    gbc.anchor = GridBagConstraints.NORTHWEST;
    gbc.gridx = 4;
    gbc.gridy = 70;
    gbObject.setConstraints (textAge, gbc);
    panelObject.add (textAge);

    // Controls for Partner

    gbc.anchor = GridBagConstraints.NORTHWEST;
    gbc.gridx = 1;
    gbc.gridy = 90;
    gbObject.setConstraints (labelPartner, gbc);
    panelObject.add (labelPartner);

    gbc.anchor = GridBagConstraints.NORTHWEST;
    gbc.gridx = 4;
    gbc.gridy = 90;
    gbObject.setConstraints (textPartner, gbc);
    panelObject.add (textPartner);

    // Controls for Country

    gbc.anchor = GridBagConstraints.NORTHWEST;
    gbc.gridx = 1;
    gbc.gridy = 110;
    gbObject.setConstraints (labelCountry, gbc);
    panelObject.add (labelCountry);

    gbc.anchor = GridBagConstraints.NORTHWEST;
    gbc.gridx = 4;
    gbc.gridy = 110;
    gbObject.setConstraints (comboCountry, gbc);
    panelObject.add (comboCountry);

    // Controls for City

    gbc.anchor = GridBagConstraints.NORTHWEST;
    gbc.gridx = 1;
    gbc.gridy = 130;
    gbObject.setConstraints (labelCity, gbc);
    panelObject.add (labelCity);

    gbc.anchor = GridBagConstraints.NORTHWEST;
    gbc.gridx = 4;
    gbc.gridy = 130;
    gbObject.setConstraints (textCity, gbc);
    panelObject.add (textCity);

    // Controls for Address

    gbc.anchor = GridBagConstraints.NORTHWEST;
    gbc.gridx = 1;
    gbc.gridy = 150;
    gbObject.setConstraints (labelAddress, gbc);
    panelObject.add (labelAddress);

    gbc.anchor = GridBagConstraints.NORTHWEST;
    gbc.gridx = 4;
    gbc.gridy = 150;
    gbObject.setConstraints (textAddress, gbc);
    panelObject.add (textAddress);

    // Controls for Zip or Postal Code

    gbc.anchor = GridBagConstraints.NORTHWEST;
    gbc.gridx = 1;
    gbc.gridy = 170;
    gbObject.setConstraints (labelZipPostal, gbc);
    panelObject.add (labelZipPostal);

    gbc.anchor = GridBagConstraints.NORTHWEST;
    gbc.gridx = 4;
    gbc.gridy = 170;
    gbObject.setConstraints (textZipPostal, gbc);
    panelObject.add(textZipPostal);
}

public static void main (String args[])
{

    newAccount customerObj;
    customerObj = new newAccount();
    bankFrame = new JFrame("Bank account");

    bankFrame.setSize(300, 300);
    bankFrame.setVisible(true);

    bankFrame.getContentPane().add(panelObject);

    customerObj.newAccount();
}
}

你的主的问题似乎在这里:

public static void main (String args[])
{

newAccount customerObj;
customerObj = new newAccount();
bankFrame = new JFrame("Bank account");

bankFrame.setSize(300, 300);
bankFrame.setVisible(true);

bankFrame.getContentPane().add(panelObject); <--- Here

customerObj.newAccount();
}
}

让你的主骄傲

【问题讨论】:

  • 虽然不应交出臃肿的代码。请提供一个显示问题的最小示例,并具体说明您的问题。

标签: java user-interface window frame pane


【解决方案1】:

大人,

您似乎无意中交换了两行代码。

代替

bankFrame.getContentPane().add(panelObject);
customerObj.newAccount();

尝试将它们按相反的顺序排列,如下所示:

customerObj.newAccount();
bankFrame.getContentPane().add(panelObject);

异常的原因是 panelObject 变量是静态的,并且在您调用 customerObj.newAccount() 之前不会被分配 - 这意味着 在原始代码中 - 由于 panelObject 为空 - 您一直试图添加任何内容窗格,这就是失败的原因。当我们第一次调用 customerObj.newAccount 时,我们正在初始化 panelObject,swing 不会抱怨。

另外请注意,您不应该从主线程与摆动组件交互,而只能从事件调度线程。为此,只需将原始 main 方法替换为以下内容:

    public static void main (String args[]) throws InvocationTargetException, InterruptedException {

    SwingUtilities.invokeAndWait(new Runnable() {
        public void run() {
            newAccount customerObj;
            customerObj = new newAccount();
            bankFrame = new JFrame("Bank account");

            bankFrame.setSize(300, 300);
            bankFrame.setVisible(true);

            customerObj.newAccount();
            bankFrame.getContentPane().add(panelObject);
        }
    });

}

invokeAndWait 会将 runnable 传递给事件调度线程,并等待 swing 执行该代码后再返回。

用替换的 main 方法运行原始代码 - 在我的机器上给出了这个:

【讨论】:

  • 成千上万的道歉,我的主,我忘了提到你应该只在事件调度线程上与 swing 交互。我编辑了我的原始答案以包含此信息。
  • 学徒,你让你的主感到骄傲。你会得到主的祝福:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
  • 2023-03-07
  • 2016-03-17
  • 2017-12-16
  • 2014-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多