3

我刚刚开始使用 Java,并且以前只使用过 PHP - 发现我很难理解面向对象的东西。我正在使用 Eclipse IDE。

我正在尝试制作一个程序来告诉你你在另一个星球上的体重——看起来很简单

到目前为止,我所做的只是在 Swing 中制作一半的界面(这就是所谓的吗?)

有时我运行它,它会像我预期的那样出现,带有标题、文本框等......其他时候(绝对没有进行任何更改),它只是出现一个空白屏幕 在此处输入图像描述

该图像显示了它工作时的样子。当它不工作时,就没有对象。它的工作时间约为 20%。

我认为这可能是因为我的下拉菜单 - 或 JComboBox,这太让人头疼了 - Eclipse 让我在每次提到 JComboBox 后添加“<Object>” - 它说“JComboBox 是原始类型。参考泛型类型 JComboBox 应该被参数化”

我不知道为什么会这样,而且我可能真的很厚,如果这是一个愚蠢的问题,对不起,但是我该如何解决这个问题,我的代码有什么问题?

package calc;

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

public class View extends JFrame {

static String titleText = "Calculate your Mass on another Plannet";

public View(){
    super(titleText);
    setSize(500,400);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);

    FlowLayout flo = new FlowLayout();
    setLayout(flo);

    JPanel inputData = new JPanel();


    //Labels
    JLabel lblTitle = new JLabel (titleText, JLabel.CENTER);
    lblTitle.setFont(new Font("Arial", Font.BOLD, 24));
    JLabel lblInputMass = new JLabel ("Weight", JLabel.LEFT);
    JLabel lblInputUnits = new JLabel("Units");     


    //Input Boxes and Lists
    JTextField txtInputMass = new JTextField(5);

    JComboBox<Object> comInputUnits;
    String arrUnits[] = {"Kilos", "Stone", "Pounds"};
    comInputUnits = new JComboBox<Object>(arrUnits);
    comInputUnits.setSelectedIndex(1);


    //Buttons
    JButton btnCalculate = new JButton("Calculate");

    //Append objects
    add(lblTitle);
    inputData.add(lblInputMass);
    inputData.add(txtInputMass);
    inputData.add(lblInputUnits);
    inputData.add(comInputUnits);
    inputData.add(btnCalculate);

    add(inputData);


}
/**
 * @param args
 */
public static void main(String[] args) {
    View sal = new View();


}

}

抱歉,这是一个很长的问题,我将非常感谢任何建议或答案,正如我所说,我对大麦了解 Java 的任何知识,并且刚刚开始 - 谢谢 :)

4

4 回答 4

8

你应该

  • 仅在事件调度线程内操作 Swing 组件;
  • setVisible(true)只有在所有组件都添加到框架后才调用;
  • 只用一个n拼出Planet,尽管这不太重要。

<Object>Eclipse 让你添加”被称为泛型类型。阅读泛型教程

于 2012-06-21T11:28:35.117 回答
3

您需要在 EventDispatchThread (EDT) 内完成所有处理 Swing 组件的工作。

将调用包装到new View()调用中SwingUtilities.invokeAndWait()

于 2012-06-21T11:29:45.703 回答
2

总是打电话pack()。这个版本工作可靠(至少出现)。

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

public class View extends JFrame {

    static String titleText = "Calculate your Weight on another Planet";

    public View(){
        super(titleText);
        // not now!
        //setSize(500,400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //setVisible(true);

        FlowLayout flo = new FlowLayout();
        setLayout(flo);

        JPanel inputData = new JPanel();

        //Labels
        JLabel lblTitle = new JLabel (titleText, JLabel.CENTER);
        lblTitle.setFont(new Font("Arial", Font.BOLD, 24));
        JLabel lblInputMass = new JLabel ("Weight", JLabel.LEFT);
        JLabel lblInputUnits = new JLabel("Units");     

        //Input Boxes and Lists
        JTextField txtInputMass = new JTextField(5);

        JComboBox comInputUnits;
        String arrUnits[] = {"Kilos", "Stone", "Pounds"};
        comInputUnits = new JComboBox(arrUnits);
        comInputUnits.setSelectedIndex(1);

        //Buttons
        JButton btnCalculate = new JButton("Calculate");

        //Append objects
        add(lblTitle);
        inputData.add(lblInputMass);
        inputData.add(txtInputMass);
        inputData.add(lblInputUnits);
        inputData.add(comInputUnits);
        inputData.add(btnCalculate);

        add(inputData);

        // force the container to layout the components.  VERY IMPORTANT!
        pack();
        setSize(500,400);
        setVisible(true);
    }

    public static void main(String[] args) {
        // This is what JB Nizet was alluding to..
        // 'start (or update) the GUI on the EDT'
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new View();
            }
        });
    }
}
于 2012-06-21T12:13:45.347 回答
-1

试试这个:

public static void main(String[] args) {
            View sal = new View();
            sal.setSize(500, 400);
            sal.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            sal.setVisible(true);

}

在构造函数之后注释这些行:

super(titleText);
setSize(500,400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);

希望有帮助。

于 2012-06-21T11:34:16.907 回答