Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JTextField不能正常工作_Java_Swing_Jtextfield - Fatal编程技术网

Java JTextField不能正常工作

Java JTextField不能正常工作,java,swing,jtextfield,Java,Swing,Jtextfield,我正在尝试使用Java制作一个简单的计算器。下面是我用来创建GUI的代码 import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class Calculator extends JFrame implements ActionListener { private JButton one, two,

我正在尝试使用Java制作一个简单的计算器。下面是我用来创建GUI的代码

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class Calculator extends JFrame implements ActionListener {

    private JButton one, two, three, four, five, six, seven, eight, nine, zero, plus, minus,
            multiply, divide, equalTo, point;
    private JPanel panelForResult, panelForKeys;
    private JLabel Result;
    private JTextField result;

    public Calculator() {
    }

    @Override
    public void actionPerformed(ActionEvent ae) {
    }

    public static void main(String... args) {


        Calculator calcFrame = new Calculator();
        calcFrame.setSize(330, 400);
        calcFrame.setVisible(true);
        calcFrame.setResizable(false);
        calcFrame.createCalcGUI();

    }

    private void createCalcGUI() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);



        Container window = getContentPane();
        window.setBackground(Color.blue);
        window.setSize(400, 400);

        FlowLayout windowLayout = new FlowLayout();
        windowLayout.setHgap(50);
        window.setLayout(windowLayout);


        panelForKeys = new JPanel();
        panelForKeys.setBackground(Color.CYAN);
        panelForKeys.setPreferredSize(new Dimension(200, 250));

        FlowLayout buttonLayout = new FlowLayout();
       // buttonLayout.setAlignOnBaseline(true);
        panelForKeys.setLayout(buttonLayout);

        panelForResult = new JPanel();
        panelForResult.setBackground(Color.CYAN);
        panelForResult.setPreferredSize(new Dimension(200, 50));
        panelForResult.setLayout(new FlowLayout());


        Result = new JLabel("=");
        result = new JTextField();

        one = new JButton("1");
        two = new JButton("2");
        three = new JButton("3");
        four = new JButton("4");
        five = new JButton("5");
        six = new JButton("6");
        seven = new JButton("7");
        eight = new JButton("8");
        nine = new JButton("9");
        zero = new JButton("0");
        plus = new JButton("+");
        minus = new JButton("-");
        multiply = new JButton("*");
        divide = new JButton("÷");
        equalTo = new JButton("=");
        point = new JButton(". ");




        one.addActionListener(this);
        two.addActionListener(this);
        three.addActionListener(this);
        four.addActionListener(this);
        five.addActionListener(this);
        six.addActionListener(this);
        seven.addActionListener(this);
        eight.addActionListener(this);
        nine.addActionListener(this);
        zero.addActionListener(this);
        plus.addActionListener(this);
        minus.addActionListener(this);
        divide.addActionListener(this);
        multiply.addActionListener(this);
        equalTo.addActionListener(this);
        point.addActionListener(this);

        panelForKeys.add(one);
        panelForKeys.add(two);
        panelForKeys.add(three);
        panelForKeys.add(four);
        panelForKeys.add(five);
        panelForKeys.add(six);
        panelForKeys.add(seven);
        panelForKeys.add(eight);
        panelForKeys.add(nine);
        panelForKeys.add(zero);
        panelForKeys.add(minus);
        panelForKeys.add(plus);
        panelForKeys.add(multiply);
        panelForKeys.add(divide);
        panelForKeys.add(equalTo);
        panelForKeys.add(point);


         window.add(panelForResult);
         window.add(this.panelForKeys);

      panelForResult.add(Result);
       panelForResult.add(result);


    }
}

每当我创建
JTextField
的实例并将其添加到
panelForResult
中时,整个容器窗口都会变为蓝色。如果我把JTextField注释掉,它就会工作。我只是一个Java初学者,我可以知道可能的原因以及如何纠正它吗?

这很可能是因为您在主线程上制作GUI,而不是在主线程上

只能在事件分派线程上访问Swing组件。这可以通过调用来实现

在您的情况下,将主方法更改为:

public static void main(String... args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            Calculator calcFrame = new Calculator();
            calcFrame.setSize(330, 400);
            calcFrame.setVisible(true);
            calcFrame.setResizable(false);
            calcFrame.createCalcGUI();
        }
    });
}
编辑: 在Java中,有一种叫做线程的东西。通过使用多个线程,可以同时运行多段代码,这可以提高效率

但是,并非所有代码都可以同时在不同的线程上安全运行。例如,Swing组件。Swing组件只能在一个称为事件分派线程的特定线程上访问


您可以阅读有关线程的更多信息。

这很可能是因为您在主线程上而不是在主线程上创建GUI

只能在事件分派线程上访问Swing组件。这可以通过调用来实现

在您的情况下,将主方法更改为:

public static void main(String... args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            Calculator calcFrame = new Calculator();
            calcFrame.setSize(330, 400);
            calcFrame.setVisible(true);
            calcFrame.setResizable(false);
            calcFrame.createCalcGUI();
        }
    });
}
编辑: 在Java中,有一种叫做线程的东西。通过使用多个线程,可以同时运行多段代码,这可以提高效率

但是,并非所有代码都可以同时在不同的线程上安全运行。例如,Swing组件。Swing组件只能在一个称为事件分派线程的特定线程上访问


您可以阅读有关线程的更多信息。

代码中存在多个问题,很难提供准确的答案。以下是一些需要解决的问题:

  • JFrame.setVisible(true)
    应该是您最后一次调用(在调用之前设置UI,或者确保在调用之后调用
    pack()
  • 不要强制
    preferredSize
    (永远不要调用
    setPreferredSize
    )。这可能是您的问题的原因。始终使用适当的
    LayoutManager
  • 不要依赖
    FlowLayout
    来执行组件包装
  • 通过设置列数,向
    JTextField
    提供大小提示
  • 在EDT上调用所有与Swing相关的代码(使用
    SwingUtilities.invokeLater()执行
下面是一个代码的工作示例(虽然不确定它是否符合您心目中的布局):


您的代码中存在几个问题,很难提供准确的答案。以下是一些需要解决的问题:

  • JFrame.setVisible(true)
    应该是您最后一次调用(在调用之前设置UI,或者确保在调用之后调用
    pack()
  • 不要强制使用
    preferredSize
    (永远不要调用
    setPreferredSize
    )。这可能是问题的原因。请始终使用适当的
    LayoutManager
  • 不要依赖
    FlowLayout
    来执行组件包装
  • 通过设置列数,向
    JTextField
    提供大小提示
  • 在EDT上调用所有与Swing相关的代码(使用
    SwingUtilities.invokeLater()执行
下面是一个代码的工作示例(虽然不确定它是否符合您心目中的布局):


请删除所有不必要的代码并尝试生成:sscce.org请删除所有不必要的代码并尝试生成:sscce。org@Leonenebula现在可以工作了。谢谢,但我可以详细知道什么是事件调度线程吗。@user2398618我添加了一些关于线程和事件调度线程的信息。@Leone nebula现在可以工作了。谢谢,但我可以知道我需要什么吗s事件调度线程的详细信息。@user2398618我添加了一些关于线程和事件调度线程的信息。