2014-06-30 52 views
1

我正在做一个文本编辑器,这是我的代码的基本版本。我用UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());使整个事物看起来像我正在使用的平台,但JFileChooser save始终是java的外观。任何人都可以帮忙吗?我可能把它在错误的地方,但我不知道在哪里JFileChooser没有按照外观和感觉

import java.awt.Container; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileWriter; 
import java.io.IOException; 
import javax.swing.AbstractAction; 
import javax.swing.Action; 
import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JFileChooser; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.filechooser.FileFilter; 
import javax.swing.filechooser.FileNameExtensionFilter; 

@SuppressWarnings("serial") 
    public class TextEditor extends JPanel { 
    static Container pane; 
    static Container paneText; 
    static BasicFrame frame; 
    static JTextArea textArea; 
    static JScrollPane areaScrollPane; 
    static FileFilter txtFile; 
    static JFileChooser save = new FileChooser(System.getProperty("user.home//documents")); 

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException,    UnsupportedLookAndFeelException, IOException { 
     UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     frame = BasicFrame.getInstance(); 
     pane = frame.getContentPane(); 
     paneText = new JPanel(); 
     textArea = new JTextArea(); 
     textArea.setLineWrap(true); 
     textArea.setWrapStyleWord(true); 
     areaScrollPane = new JScrollPane(textArea); 
     areaScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
     areaScrollPane.setPreferredSize(new Dimension(250, 250)); 
     int hGap = 10; 
     int vGap = 20; 
     pane.setLayout(new FlowLayout(FlowLayout.LEFT, hGap, vGap)); 
     Action SaveAs = new SaveAs("Save File", "Writes the text file"); 
     JButton one = new JButton(SaveAs); 
     one.addActionListener(null); 
     txtFile = new FileNameExtensionFilter("Text File (.txt)", "txt"); 
     save.addChoosableFileFilter(txtFile); 
     save.setFileFilter(txtFile); 
     save.setAcceptAllFileFilterUsed(true); 
     pane.add(areaScrollPane); 
     pane.add(one); 
     pane.add(paneText); 
     paneText.setLayout(new BoxLayout(paneText, BoxLayout.Y_AXIS)); 
     frame.setSize(450, 320); 
     frame.setVisible(true); 
    } 

    static class SaveAs extends AbstractAction { 
     public SaveAs(String text, String desc) { 
      super(text); 
      putValue(SHORT_DESCRIPTION, desc); 
     } 

     public void actionPerformed(ActionEvent e) { 
      save.setFileHidingEnabled(false); 
      save.setApproveButtonText("Save"); 
      save.setSelectedFile(new File("new 1")); 
      int actionDialog = save.showSaveDialog(null); 
      if (actionDialog != JFileChooser.APPROVE_OPTION) { 
       return; 
      } else { 
       log("Done!", true); 
      } 
      String name = save.getSelectedFile().getAbsolutePath(); 
      if (!name.endsWith(".txt") && save.getFileFilter() == txtFile) { 
       name += ".txt"; 
      } 
      BufferedWriter outFile = null; 
      try { 
       outFile = new BufferedWriter(new FileWriter(name)); 
       textArea.write(outFile); 

      } catch (IOException ioe) { 
       ioe.printStackTrace(); 
      } finally { 
       if (outFile != null) { 
        try { 
         outFile.close(); 
        } catch (IOException ioee) { 
        } 
       } 
      } 
     } 

     private void log(String msg, boolean remove) { 

      JLabel label1; 
      label1 = new JLabel(msg); 
      if (remove) { 
       paneText.removeAll(); 
      } 
      paneText.add(label1); 
      paneText.validate(); 
      pane.validate(); 
      new Thread() { 
       public void run() { 
        try { 
         Thread.sleep(1000); 
        } catch (InterruptedException ie) { 
         ie.printStackTrace(); 
        } 
        paneText.removeAll(); 
        paneText.validate(); 
        pane.validate(); 
       } 
      }.start(); 
     } 
    } 
} 

回答

4

在你的代码的JFileChooserstatic,因此查找之前实例化,并感觉在main设置。

在实例化之前设置外观和感觉。所以,在static区块,因为您的JFileChooserstatic

... 
static FileFilter txtFile; 
static JFileChooser save; 

static { 
    try { 
     UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
    } 
    catch (ClassNotFoundException | 
      InstantiationException | 
      IllegalAccessException | 
      UnsupportedLookAndFeelException e) { 
     e.printStackTrace(); 
    } 
    save = new JFileChooser(System.getProperty("user.home//documents")); 
} 

public static void main(String[] args) { 
    frame = new JFrame(); 
    pane = frame.getContentPane(); 
    ... 
    ... 
+0

我感动了'保存=新的JFileChooser(System.getProperty( “//的user.home文件”));'出块和后添加的,并得到了摆脱块上的“静态”,因为它给了我错误,但现在我得到一个'在线程中的异常“主”java.lang.Error:未解决的编译问题:'和5'保存不能解决'然后一个'在guiWithSwing.TextEditor.main(TextEditor.java:84)' – Jeffmagma

+0

我修正了错误,所以我可以测试代码,但它什么也没做。现在,包括按钮在内的所有东西都具有Java外观 – Jeffmagma

+0

您需要有'static'块来设置L&F并初始化File Chooser。由于您的文件选择器是静态的,如果您没有静态块,文件选择器将在L&F设置之前初始化,而没有结果。对于你的错误:你需要有'静态JFileChooser保存'和'静态'块。看起来你也删除了声明。 – Nivas

0

相反的System.getProperty("user.home//documents"),类型(System.getProperty("user.home") + "/documents")(假设你的文件夹被称为“文件”)。前者将返回null,将JFileChooser的位置设置为其默认位置 - 用户的主目录。

这是因为"user.home//documents"不是System.getProperty()的定义键,而"user.home"是。

你也可以设置你JFileChoosernew JFileChooser(<path>)而非new FileChooser(<path>)

0

LookAndFeel声明必须在对象初始化之前进行,否则该对象将不会承担这些LookAndFeel属性。

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 

THEN

save = new FileChooser(System.getProperty("user.home//documents"));