2012-07-21 58 views
2

这是什么导致我无法在此代码中使用'strAppName'变量?我现在在这里评论显示/*strAppName*/; JFrame frame = new JFrame(/*strAppName*/);我该如何访问本地.properties变量? Java Swing正确的变量使用

当我运行System.out.println(strAppName);时,它显示在Eclipse控制台中并带有应用程序名称。谢谢!

package base; 

import java.awt.BorderLayout; 
import java.awt.FlowLayout; 
import java.io.*; 
import java.util.*; 

import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.SwingUtilities; 

public class StickyNotes extends JFrame { 

    private static final long serialVersionUID = 1L; 

    public final static String SAVE_CHANGES = "Save changes?"; 
    public final static String TITLE_AYS = "Are You Sure?"; 

    private void createStickyNotesGUI() { 

     Properties configProperties = new Properties(); 
     try { 

      FileInputStream fileInputStream = new FileInputStream("resources/config.properties"); 
      configProperties.load(fileInputStream);   
      String strAppName = configProperties.getProperty("appName"); 
      //System.out.println(strAppName); 
      fileInputStream.close(); // better in finally block ?? /* http://en.wikipedia.org/wiki/.properties */ 
     } catch (Exception ex){ 
      //TODO 
      System.out.println("Exception: " + ex); 
     } 

/*  LoadPropertiesExample config = new LoadPropertiesExample(); 
     config.loadProps2(); 
     config.sayHello();*/ 

     // Create and set up the window. 
     JFrame frame = new JFrame(/*strAppName*/); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLayout(new FlowLayout(FlowLayout.LEFT)); 

     // Add Main Menu 
     MainMenuBar mainMenu = new MainMenuBar(); 
     frame.setJMenuBar(mainMenu.createMainMenuBar(frame)); 

     // Add Content Pane // can I pass a layout object? 
     frame.setContentPane(ContentPaneCreator.createContentPane()); 
     // contentPane.add(scrollPane, BorderLayout.CENTER); 

     // Add Tool Bar 
     ToolBarCreator toolBar = new ToolBarCreator(); 
     frame.getContentPane().add(toolBar.createToolBar(), BorderLayout.NORTH); 

     // Add Label 
     frame.getContentPane().add(
       LabelCreator.createLabel(frame, 
         "use Swing and JavaFX together."), BorderLayout.NORTH); 

     // Display the window. 
     frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
     // TODO 
     /*set configuration to remember frame size*/ 

     frame.setVisible(true); 
    } 

    public void doExit(JFrame frame) { 
     boolean fDirty = true; 
     if (fDirty) 
      switch (JOptionPane.showConfirmDialog(StickyNotes.this, SAVE_CHANGES, 
        TITLE_AYS, JOptionPane.YES_NO_OPTION)) { 
      case JOptionPane.YES_OPTION: 
       // if (doSave()) 
       frame.dispose(); 
       break; 
      case JOptionPane.NO_OPTION: 
       frame.dispose(); 
      } 
     else 
      frame.dispose(); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new StickyNotes().createStickyNotesGUI(); 
      } 
     }); 
    } 
} 

回答

4

你不能在你的JFrame构造函数中使用strAppName,因为它超出范围。你在你的try/catch块中声明它。

试试这个:

String strAppName = null; 
    try { 

     FileInputStream fileInputStream = new FileInputStream("resources/config.properties"); 
     configProperties.load(fileInputStream);   
     strAppName = configProperties.getProperty("appName"); 
     //System.out.println(strAppName); 
     fileInputStream.close(); // better in finally block ?? /* http://en.wikipedia.org/wiki/.properties */ 
    } catch (Exception ex){ 
     //TODO 
     System.out.println("Exception: " + ex); 
    } 
+0

没错,1+。对于@jojo,是的,使用finally块关闭您的Stream。如果发生异常,但是您希望应用程序关闭吗?或者也许使用JFrame的替代构造函数? – 2012-07-21 16:06:42