从外部方法更改void GUI构造函数的JLabel值

时间:2013-08-11 19:25:11

标签: java swing user-interface static-methods settext

我正在尝试创建一个方法,以便在我的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,但我仍然得到相同的错误消息。

如果您需要任何进一步的信息,请告诉我。

谢谢你的帮助!!

2 个答案:

答案 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的实例是不必要的,因为changeWindowInformationcreateFileChooser将是同一个实例的成员,因此它们共享相同的类成员。 在这种情况下,您的代码应为:

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()