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);
}
});
}
}