Java 使用get方法时,字符串返回null
我试图在另一个类中设置字符串的值,然后从第三个类中获取它。现在我正在尝试使用set和get方法,但我无法让它工作!当用户启动程序时,会出现一个按钮。当按下按钮时,测试字符串获取值Hello。然后我调用set类并在参数中进行测试。现在在set方法中,它是一个System.out.println,它打印Hello,但是当我试图从第二个类中获取该方法时,它打印null。我不知道为什么!以下是我的课程:Java 使用get方法时,字符串返回null,java,string,swing,class,actionlistener,Java,String,Swing,Class,Actionlistener,我试图在另一个类中设置字符串的值,然后从第三个类中获取它。现在我正在尝试使用set和get方法,但我无法让它工作!当用户启动程序时,会出现一个按钮。当按下按钮时,测试字符串获取值Hello。然后我调用set类并在参数中进行测试。现在在set方法中,它是一个System.out.println,它打印Hello,但是当我试图从第二个类中获取该方法时,它打印null。我不知道为什么!以下是我的课程: public class Class1 { public static void main(
public class Class1 {
public static void main(String[] args) {
Class3 c3 = new Class3();
c3.setFilename("Hello");
JFrame frame = new JFrame("Action Listener");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new FlowLayout());
JButton button = new JButton("Click me!");
frame.add(button);
Class2 c2 = new Class2();
button.addActionListener(c2);
frame.setSize(300, 100);
frame.setVisible(true);
}
}
这是我的第二个类,它是我想在下一个类中使用的文件名字符串:
public class Class2 implements ActionListener {
String filename;
public void actionPerformed(ActionEvent e) {
Class3 c3 = new Class3();
filename = c3.getFilename();
System.out.println(filename); // Prints null
}
}
下面是第三节课:
public class Class3 {
String filename;
public String getFilename() {
return filename;
}
public void setFilename(String filename) {
this.filename = filename;
System.out.println(filename); // Prints Hello
}
}
你的问题包括:
您从未设置过train类的文件名检查它-您在哪里调用fileName=something?
您正在创建新的列车对象,并希望新对象能够感知对其他列车对象所做的更改。Java不是这样工作的。您需要测试更改的同一对象。
您的程序命名约定既混乱又危险。请记住,类名以大写字母开头。不要给变量起与不相关的类相同的名字,比如你的train类和train button。
您的程序有很多不必要的复杂性,例如使调试和增强变得困难的并行阵列。
您正在交换JPanel的内容,而不是使用更易于使用的CardLayout来进行交换。
例如,可以将JButton字符串名和文件名封装在类或枚举中。使用类的优点是,您可以从文件中读入数据,并从文件数据创建类的对象,从而提供额外的灵活性,但是出于我的示例的目的,为了避免添加额外的文件,我将使用枚举,例如
public enum ButtonFileName {
MONDAY("Monday", KeyEvent.VK_M, "monday_blues.jpg"),
TUESDAY("Tuesday", KeyEvent.VK_T, "tuesday_fun.jpg"),
WEDNESDAY("Wednesday", KeyEvent.VK_W, "humpday.jpg"),
THURSDAY("Thursday", KeyEvent.VK_H, "almost_friday.jpg");
private String buttonText;
private String fileName;
private int mnemonic;
private ButtonFileName(String buttonText, int mnemonic, String fileName) {
this.buttonText = buttonText;
this.mnemonic = mnemonic;
this.fileName = fileName;
}
public String getButtonText() {
return buttonText;
}
public int getMnemonic() {
return mnemonic;
}
public String getFileName() {
return fileName;
}
}
然后我可以给我的主类一个ButtonFileName变量,selectedButtonFileName,然后在按下按钮时填充该变量。我还可以为每个ButtonFileName枚举创建自己的操作,并使用这些操作设置按钮。例如:
import java.awt.CardLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.*;
@SuppressWarnings("serial")
public class Home2 extends JPanel {
private static final String TRAIN_PANEL = "train panel";
private static final String BTN_ROW_PANEL = "btn row panel";
private CardLayout cardLayout = new CardLayout();
private ButtonFileName selectedButtonFileName = null;
private JPanel buttonRowPanel = new JPanel();
private JPanel trainPanel = new JPanel();
public Home2() {
buttonRowPanel = createButtonRowPanel();
trainPanel = createTrainPanel();
setLayout(cardLayout);
add(buttonRowPanel, buttonRowPanel.getName());
add(trainPanel, trainPanel.getName());
}
private JPanel createButtonRowPanel() {
JPanel btnRowPanel = new JPanel(new GridLayout(1, 0, 5, 5));
btnRowPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
btnRowPanel.setName(BTN_ROW_PANEL);
for (ButtonFileName btnFileName : ButtonFileName.values()) {
JButton btn = new JButton(new RowButtonAction(btnFileName, this));
btnRowPanel.add(btn);
}
return btnRowPanel;
}
private JPanel createTrainPanel() {
JPanel trainPanel = new JPanel();
trainPanel.setName(TRAIN_PANEL);
JButton trainBtn = new JButton(new TrainAction("Train", KeyEvent.VK_T, this));
trainPanel.add(trainBtn);
return trainPanel;
}
public ButtonFileName getSelectedButtonFileName() {
return selectedButtonFileName;
}
public void setSelectedButtonFileName(ButtonFileName selectedButtonFileName) {
this.selectedButtonFileName = selectedButtonFileName;
}
public void nextCardLayoutView() {
cardLayout.next(this);
}
private static void createAndShowGui() {
JFrame frame = new JFrame("Home2");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new Home2());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
又是枚举
enum ButtonFileName {
MONDAY("Monday", KeyEvent.VK_M, "monday_blues.jpg"),
TUESDAY("Tuesday", KeyEvent.VK_T, "tuesday_fun.jpg"),
WEDNESDAY("Wednesday", KeyEvent.VK_W, "humpday.jpg"),
THURSDAY("Thursday", KeyEvent.VK_H, "almost_friday.jpg");
private String buttonText;
private String fileName;
private int mnemonic;
private ButtonFileName(String buttonText, int mnemonic, String fileName) {
this.buttonText = buttonText;
this.mnemonic = mnemonic;
this.fileName = fileName;
}
public String getButtonText() {
return buttonText;
}
public int getMnemonic() {
return mnemonic;
}
public String getFileName() {
return fileName;
}
}
我对火车按钮的行动
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
@SuppressWarnings("serial")
public class TrainAction extends AbstractAction {
private Home2 home;
public TrainAction(String name, int mnemonic, Home2 home) {
super(name);
putValue(MNEMONIC_KEY, mnemonic);
this.home = home;
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Selected File Name: "
+ home.getSelectedButtonFileName().getFileName());
home.nextCardLayoutView();
}
}
我对行按钮的操作
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
@SuppressWarnings("serial")
public class RowButtonAction extends AbstractAction {
private ButtonFileName btnFileName;
private Home2 home;
public RowButtonAction(ButtonFileName btnFileName, Home2 home) {
super(btnFileName.getButtonText());
putValue(MNEMONIC_KEY, btnFileName.getMnemonic());
this.btnFileName = btnFileName;
this.home = home;
}
@Override
public void actionPerformed(ActionEvent e) {
home.setSelectedButtonFileName(btnFileName);
home.nextCardLayoutView();
}
}
至于灵活性,假设我想添加另一个JButton和文件名。将Friday元素添加到枚举中,就完成了。什么不起作用?您是否尝试过使用IDE的调试器工具调试代码?代码太多,上下文太少。@Mohammad是的,我尝试过用IDE和System.out.println调试代码,当它到达第三个类时返回null。@Bennyz返回null。@WeeRox不仅如此。你应该从你的例子中删除所有与你的问题无关的东西。考虑从零开始和编写新的示例,大多数情况下,该方法比移除现有代码更快和更安全。