我有这个代码示例。我需要在运行应用程序时更改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);
}
});
}
}
有人可以告诉我这里有什么问题吗?
答案 0 :(得分:1)
那是因为你通过在MainWindow的构造函数中创建一个MainWindow的新对象而陷入无限循环,实质上是试图创建无限量的新Frame。
由于您已经在MainWindow的构造函数中,因此无需再次实例化MainWindow。
答案 1 :(得分:0)
您的第二个代码显示JFrame
,因为这是它需要完成的实际方式。
在你的第一个代码中,MainWindow()
本身就是一个构造函数,而你又在同一个构造函数中调用另一个MainWindow
实例,这是完全错误的。
猜猜看,你在自己的构造函数中一次又一次地调用MainWindow
因为它将作为无限循环工作。这就是你坚持到那里的原因。
Java中的构造函数是一个类似于方法的代码块 在创建对象的实例时调用。
但是你不需要在任何类的自己的构造函数中创建对象的实例。
修改强>
您的第一个代码段中有几个错误。让我为你清楚那些:
MainWindow m=new MainWindow();
中的 MainWindow()
。正如我之前提到的那样,它变成了一个无限循环,这完全是非法的。
因此,在您的第二个代码段中提到了执行此操作的正确方法
this.getContentPane().setBackground(new Color(10, 20, 30));
N.B。:通过在构造函数中声明上面的行意味着它将在运行时显示。
在jButton2ActionPerformed(java.awt.event.ActionEvent evt)
方法内,您正在调用MainWindow
的另一个对象。这将很好地运行代码,但不会按您的意愿运行。看这里你正在创建该类的另一个对象。但也许你不想要这个。现在让我通过例子清楚这一点:
假设,在构造函数中,您首先在setBackground()
方法中提到了RED颜色。然后在MainWindow
内创建了jButton2ActionPerformed()
的另一个对象,并将颜色设置为setBackground()
。现在你运行程序。该程序最初运行良好,显示红色背景彩色框架。但是当你点击按钮时,猜猜会发生什么。红色的JFrame将保持原样,并且当您在按钮操作上创建该类的另一个实例时,然后在单击该按钮后,另一个新的JFrame将显示为蓝色。点击按钮后无限无。时间,无限的。将创建新的JFrame。除非有任何特殊情况,否则在任何程序中都可能没有人想要它。