即使我创建了一个类的Object并调用它,JFrame也没有显示出来

时间:2017-06-25 14:10:42

标签: java swing jframe

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

但是,当我将object称为class,并使用它的参考变量调用它时,JFrame没有显示出来(我认为它被卡住了或其他什么)我甚至无法在任务栏中看到java图标。

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

package lockme;

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

public class MainWindow extends javax.swing.JFrame {

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

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

`

但是当我改变上面的代码时它会显示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);
        }
    });
}
    }

有人可以告诉我这里有什么问题吗?

2 个答案:

答案 0 :(得分:1)

那是因为你通过在MainWindow的构造函数中创建一个MainWindow的新对象而陷入无限循环,实质上是试图创建无限量的新Frame。

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

答案 1 :(得分:0)

您的第二个代码显示JFrame,因为这是它需要完成的实际方式。

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

猜猜看,你在自己的构造函数中一次又一次地调用MainWindow因为它将作为无限循环工作。这就是你坚持到那里的原因。

  

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

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

修改

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

    构造函数MainWindow m=new MainWindow();中的
  1. MainWindow()。正如我之前提到的那样,它变成了一个无限循环,这完全是非法的。

    因此,在您的第二个代码段中提到了执行此操作的正确方法 this.getContentPane().setBackground(new Color(10, 20, 30));

    N.B。:通过在构造函数中声明上面的行意味着它将在运行时显示。

  2. jButton2ActionPerformed(java.awt.event.ActionEvent evt)方法内,您正在调用MainWindow的另一个对象。这将很好地运行代码,但不会按您的意愿运行。看这里你正在创建该类的另一个对象。但也许你不想要这个。现在让我通过例子清楚这一点:

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