JFrame:在构造函数中更改值后,字符串变回空
JFrame: String changing back to null after the value is changed in the constructor
澄清一下,我在 Netbeans 中使用 JFrame 表单。
好吧,基本上我正在尝试使用构造函数更改 public 全局字符串 (PictureName) 的值,因为我正在尝试从另一个 class 获取另一个值,但是当我尝试在 JLabel 的代码中使用它时,它显示为空。这是代码
public class ShowPage extends javax.swing.JFrame {
public javax.swing.JLabel Picture;
public String PictureName;
public ShowPage() {
initComponents();
}
public ShowPage (String picName){
PictureName = picName;
}
private void initComponents() {
Picture = new javax.swing.JLabel();
getContentPane().add(Picture);
Picture.setBounds(20, 60, 300, 130);
Picture.setIcon(new javax.swing.ImageIcon(getClass().getResource("/MiniProject/imagesMain/"+PictureName)));
pack();
}
知道为什么 PictureName 在构造函数中被更改(是的,它已通过 SOP 检查)后仍然为空吗?
顺便说一句,这是 PSVM
public static void main(String args[]) {
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(ShowPage.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(ShowPage.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(ShowPage.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(ShowPage.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new ShowPage().setVisible(true);
}
});
您调用的是无参数构造函数,而不是将图片名称作为参数的构造函数。在 main
你应该调用:
public void run() {
new ShowPage(pictureName).setVisible(true);
}
其中pictureName
是存放图片文件名的变量
构造函数也需要像无参构造函数一样调用initComponents()
:
public ShowPage (String picName) {
PictureName = picName;
initComponents();
}
它抛出一个空事件只是因为你从未初始化你的变量。
在您的 main 中,您调用了没有参数的构造函数,这意味着永远不会创建 PictureName
。
你应该试试这个
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new ShowPage("image.png").setVisible(true);
}
});
在此之后,您应该在 ShowPage(String picName)
构造函数中添加方法 initComponent()
,否则它将永远不会被调用。
public ShowPage (String picName){
PictureName = picName;
this.initComponent();
}
其他一些建议:
而不是写 javax.swing.JFrame
,只需在文件顶部添加一个 import:
import javax.swing.JFrame;
甚至 import javax.swing.*;
从包中导入所有 类(如 JLabel
)
一定要用小写的第一个字符写你的变量,这是编程的基本规则:PictureName
-> pictureName
澄清一下,我在 Netbeans 中使用 JFrame 表单。
好吧,基本上我正在尝试使用构造函数更改 public 全局字符串 (PictureName) 的值,因为我正在尝试从另一个 class 获取另一个值,但是当我尝试在 JLabel 的代码中使用它时,它显示为空。这是代码
public class ShowPage extends javax.swing.JFrame {
public javax.swing.JLabel Picture;
public String PictureName;
public ShowPage() {
initComponents();
}
public ShowPage (String picName){
PictureName = picName;
}
private void initComponents() {
Picture = new javax.swing.JLabel();
getContentPane().add(Picture);
Picture.setBounds(20, 60, 300, 130);
Picture.setIcon(new javax.swing.ImageIcon(getClass().getResource("/MiniProject/imagesMain/"+PictureName)));
pack();
}
知道为什么 PictureName 在构造函数中被更改(是的,它已通过 SOP 检查)后仍然为空吗?
顺便说一句,这是 PSVM
public static void main(String args[]) {
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(ShowPage.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(ShowPage.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(ShowPage.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(ShowPage.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new ShowPage().setVisible(true);
}
});
您调用的是无参数构造函数,而不是将图片名称作为参数的构造函数。在 main
你应该调用:
public void run() {
new ShowPage(pictureName).setVisible(true);
}
其中pictureName
是存放图片文件名的变量
构造函数也需要像无参构造函数一样调用initComponents()
:
public ShowPage (String picName) {
PictureName = picName;
initComponents();
}
它抛出一个空事件只是因为你从未初始化你的变量。
在您的 main 中,您调用了没有参数的构造函数,这意味着永远不会创建 PictureName
。
你应该试试这个
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new ShowPage("image.png").setVisible(true);
}
});
在此之后,您应该在 ShowPage(String picName)
构造函数中添加方法 initComponent()
,否则它将永远不会被调用。
public ShowPage (String picName){
PictureName = picName;
this.initComponent();
}
其他一些建议:
而不是写
javax.swing.JFrame
,只需在文件顶部添加一个 import:import javax.swing.JFrame;
甚至import javax.swing.*;
从包中导入所有 类(如JLabel
)一定要用小写的第一个字符写你的变量,这是编程的基本规则:
PictureName
->pictureName