我正在尝试创建一个方法,以便在我的creatAndShowGUI()方法中更改JLabel的值。我想要做的是在导入文件后更改某些JLabel的值(根据文件信息)。
private static void createAndShowGUI(){
// Create and set up window
final JFrame frame = new JFrame("SongApp");
// Display the window
frame.setSize(400, 150);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Set flowlayout
frame.getContentPane().setLayout(new FlowLayout());
try{
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
} catch(Exception e){
System.err.println("Cannot set look and feel: " + e);
}
JButton loadFile = new JButton("Choose a new file ...");
JLabel songLength = new JLabel("0:00");
JLabel songName = new JLabel("No song selected yet");
loadFile.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
createFileChooser(frame);
}
});
frame.getContentPane().add(loadFile);
frame.getContentPane().add(songLength);
frame.getContentPane().add(songName);
}
我的方法需要无效,因为我稍后在
中的main方法中调用它 javax.swing.SwingUtilities.invokeLater(new Runnable(){
public void run(){
createAndShowGUI();
}
});
在此之后我创建了一个方法如下:
private static void changeWindowInformation(String filename, int time) {
createAndShowGUI().songName.setText(filename);
// code to check time of song and return it in format xx:xx
createAndShoGUI().songLength.setText(time);
}
在createFileChooser方法中调用此方法,该方法在单击JButton之后在createAndShowGUI()方法中调用。
我看到一条错误消息:void无法解除引用。我是Java编程的新手,并不知道我做错了什么。我应该在我的代码中的其他地方创建我的框架(也许在我的主要方法下?)或者我是不是以正确的方式访问JLabel?我试图将方法调用放在我的loadFile.addActionListener方法中,并使其只返回字符串,以便我可以访问loadFile.addActionListener中的JLabel,但我仍然得到相同的错误消息。
如果您需要任何进一步的信息,请告诉我。
谢谢你的帮助!!
答案 0 :(得分:2)
你应该创建自己的Frame-class继承JFrame并将更改的标签添加为类成员,因为gparyani已经评论过了
您无法从其他方法访问方法中声明的局部变量。
例如:
public class MyFrame extends JFrame {
private JLabel songName, songLength;
public MyFrame() {
super("SongApp");
songLength = new JLabel("0:00");
songName = new JLabel("No song selected yet");
JButton loadFile = new JButton("Choose a new file ...");
//other UI settings
loadFile.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
createFileChooser(this);
}
});
getContentPane().add(loadFile);
getContentPane().add(songLength);
getContentPane().add(songName);
}
public void changeWindowInformation(String filename, int time) {
this.songName.setText(filename);
this.songLength.setText(yourFormattedTime);
}
}
此外,您可以将此课程的引用传递给createFileChooser()
public void createFileChooser(MyFrame callingFrame) {
//your filechooser logic
callingFrame.changeWindowInformation(filename, time);
}
如果createFileChooser()
是MyFrame的方法,则传递MyFrame的实例是不必要的,因为changeWindowInformation
和createFileChooser
将是同一个实例的成员,因此它们共享相同的类成员。
在这种情况下,您的代码应为:
public void createFileChooser() {
//your filechooser logic
changeWindowInformation(filename, time);
}
使用此功能,您可以用以下内容替换整个createAndShowGUI()
- 来电:
javax.swing.SwingUtilities.invokeLater(new Runnable(){
public void run(){
MyFrame frame = new MyFrame();
frame.setVisible(true);
}
});
答案 1 :(得分:0)
使songName标签成为该类的成员变量。在createAndShowGUI()方法之外声明它,然后你就可以直接访问它,如下所示:
m_songName.setText()