Java 即使我创建了类的对象并调用它,JFrame也不会出现

Java 即使我创建了类的对象并调用它,JFrame也不会出现,java,swing,jframe,Java,Swing,Jframe,我有这个代码示例。运行应用程序时,我需要更改JFrame的背景色 但是当我调用类的create a对象并用它的引用变量调用它时,JFrame没有显示(我想它被卡住了或者什么的),我甚至看不到任务栏中的java图标 这是我的代码(仅类的构造函数) ` 但是当我这样修改上面的代码时,它会显示JFrame: package lockme; import java.awt.Color; import javax.swing.JFrame; public class MainWindow extend

我有这个代码示例。运行应用程序时,我需要更改
JFrame
的背景色

但是当我调用
类的create a
对象
并用它的引用变量调用它时,
JFrame
没有显示(我想它被卡住了或者什么的),我甚至看不到任务栏中的
java
图标

这是我的代码(仅类的构造函数)

`

但是当我这样修改上面的代码时,它会显示
JFrame

package lockme;

import java.awt.Color;
import javax.swing.JFrame;

public class MainWindow extends javax.swing.JFrame {

    public MainWindow() {
        initComponents();
        //MainWindow m=new MainWindow();
        this.setSize(1368, 768);
        this.getContentPane().setBackground(new Color(10, 20, 30));

    }
    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
          //MainWindow m=new MainWindow();
          this.getContentPane().setBackground(new Color(100, 40, 20));//This isworking
    }
    public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new MainWindow().setVisible(true);
        }
    });
}
    }

有谁能告诉我这里出了什么问题吗?

这是因为在MainWindow的构造函数中创建一个新的MainWindow对象,实际上试图创建无限多的新帧,从而陷入了无限循环


由于您已经在MainWindow的构造函数中,因此不需要再次实例化MainWindow。

您的第二个代码显示了
JFrame
,因为这是实际需要执行的方式

在您的第一个代码中,
MainWindow()
本身是一个构造函数,而您再次调用同一个构造函数中的
MainWindow
的另一个实例,这是完全错误的

猜猜看,您在自己的构造函数中一次又一次地调用
main窗口,因为它将作为无限循环工作。这就是你为什么站在那里的原因

Java中的构造函数是一个代码块,类似于 在创建对象的实例时调用

但是您不需要在任何类自己的构造函数中创建对象的实例

编辑:

您的第一个代码段中有几个错误。让我为你澄清一下:

  • MainWindow m=newmainwindow()在构造函数内
    MainWindow()
    。正如我前面提到的,它变成一个无限循环是完全非法的

    因此,您的第二段代码片段中提到了正确的方法。
    this.getContentPane().setBackground(新颜色(10,20,30))

    N.B.:在构造函数中声明上述行意味着它将在运行时显示

  • jButton2ActionPerformed(java.awt.event.ActionEvent evt)
    方法中,您正在调用
    MainWindow
    的另一个对象。这将很好地运行代码,但不会像您希望的那样工作。看这里,您正在创建该类的另一个对象。但也许你不想要这个。现在让我举例说明:

    假设,首先在构造函数中,您在
    setBackground()方法中提到了红色。然后在
    jButton2ActionPerformed()
    内部创建另一个
    main窗口的对象,并提供蓝色作为
    setBackground()
    。现在运行程序。程序最初运行良好,显示红色背景色的框架。但是当你点击按钮时,猜猜会发生什么。红色的JFrame将保持原样,当您在button action上创建该类的另一个实例时,单击按钮后,另一个新的JFrame将显示为蓝色。当你点击按钮无限次后,一个无限次的新JFrame将被创建。除非有特殊情况,否则在任何程序中都可能没有人希望这样


  • 好的,谢谢。但是,我可以创建一个对象并在其他地方调用它吗?比如在一种方法中?或者在按钮的函数中?但是,如何以及在何处调用类的对象?你能给我举个例子吗?是的,你可以创建一个类的对象并在其他方法中调用它。但是仔细想想,您正在该类的任何方法中创建该类的对象,这意味着您正在创建同一类的另一个实例。所以,通常我们不会在同一个类内调用构造函数,除非出于任何目的我们需要相同类的副本。在任何类中,我们都可以更改任何其他对象的属性,而无需调用构造函数。正如您在第二段代码中所做的那样,使用
    this.setSize()
    。但这不起作用。我需要在单击
    jButton2
    时更改背景色。为此,我创建了一个类MainWindow的
    对象
    ,并像往常一样设置颜色。但当我单击按钮时,没有任何更改:(是的,我完全可以理解我做错了什么。但是先生,有没有一种方法可以不用调用这个来改变背景色。关键字?如果我在
    jButton2
    中写了一个
    线程
    ?那么我就不能使用这个。要改变背景色,因为现在这个。将引用
    线程
    。对吗?那么,如何使用c我可以这样做吗?但是,我如何以及在哪里可以调用类的对象?你能给我一个例子吗?但是我需要在单击按钮时设置背景色。即使我创建了一个对象,它也不会起作用。为什么?我不确定我是否完全理解你的问题。如果你想在按下按钮后更改背景,只需添加一行:getContentPane().setBackground(新颜色(10、20、30));在您的actionperformed函数中,但这不起作用。我需要在单击
    jButton2
    时更改背景色。为此,我创建了一个类MainWindow的对象,并按常设置颜色。但单击按钮时,没有更改:(
    package lockme;
    
    import java.awt.Color;
    import javax.swing.JFrame;
    
    public class MainWindow extends javax.swing.JFrame {
    
        public MainWindow() {
            initComponents();
            //MainWindow m=new MainWindow();
            this.setSize(1368, 768);
            this.getContentPane().setBackground(new Color(10, 20, 30));
    
        }
        private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
              //MainWindow m=new MainWindow();
              this.getContentPane().setBackground(new Color(100, 40, 20));//This isworking
        }
        public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new MainWindow().setVisible(true);
            }
        });
    }
        }