9

JFileChooserWindowsのルックアンドフィールを持つを生成しようとしています。それを変更するメソッドが見つからなかったのでJFileChooser、次のコードでUIを変更する拡張する基本クラスを作成しました。

public FileChooser(){
  this(null);
}
public FileChooser(String path){
   super(path);
   try {
      UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");

    } catch (Exception e) { System.err.println("Error: " + e.getMessage()); }

それから、別のクラスで、私は電話します

FileChooser chooser = new FileChooser(fileName);
int val = chooser.showOpenDialog(null);

ただし、表示されるダイアログボックスにはJavaのルックアンドフィールがあります。これを変更する方法について何か考えはありますか?この拡張クラスの代わりに使用できるJFileChooserクラスのメソッドはありますか?

ありがとうございました!

4

8 に答える 8

15

アプリケーション全体のルックアンドフィールを設定できることは知っていますが、クロスプラットフォームのルックアンドフィールが好きで、JFileChoosersのシステムルックアンドフィールが必要な場合はどうしますか。特に、クロスプラットフォームには適切なファイルアイコンすらありません(そして完全に安っぽく見えます)。

これが私がしたことです。それは間違いなくハックです...

public class JSystemFileChooser extends JFileChooser{
   public void updateUI(){
      LookAndFeel old = UIManager.getLookAndFeel();
      try {
         UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
      } 
      catch (Throwable ex) {
         old = null;
      } 

      super.updateUI();

      if(old != null){
         FilePane filePane = findFilePane(this);
         filePane.setViewType(FilePane.VIEWTYPE_DETAILS);
         filePane.setViewType(FilePane.VIEWTYPE_LIST);

         Color background = UIManager.getColor("Label.background");
         setBackground(background);
         setOpaque(true);

         try {
            UIManager.setLookAndFeel(old);
         } 
         catch (UnsupportedLookAndFeelException ignored) {} // shouldn't get here
      }
   }



   private static FilePane findFilePane(Container parent){
      for(Component comp: parent.getComponents()){
         if(FilePane.class.isInstance(comp)){
            return (FilePane)comp;
         }
         if(comp instanceof Container){
            Container cont = (Container)comp;
            if(cont.getComponentCount() > 0){
               FilePane found = findFilePane(cont);
               if (found != null) {
                  return found;
               }
            }
         }
      }

      return null;
   }
}
于 2010-12-03T21:51:02.340 に答える
8

ルックアンドフィールを変更する必要がない場合は、エントリクラスのメインメソッドにUIManager.setLookAndFeel(..)行を配置してみてください。

それは私にとってはうまくいくようですが、なぜそれがあなたが設定したように機能しないのかについて私は途方に暮れています。

于 2010-02-17T16:11:26.953 に答える
4

まず、コマンドラインからコードを実行し、そこでルックアンドフィールを指定して、コードが適用できることを確認します。

 java -Dswing.defaultlaf=com.sun.java.swing.plaf.windows.WindowsLookAndFeel YourApp

正しいルックアンドフィールが適用される場合は、JFileChooserダイアログを作成する前に、ルックアンドフィールコードをプログラムに追加できます。簡単なプログラムは次のようになります。

 public static void main(String[] args) {
try {

    UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");

} 
catch (Exception e) {
   // handle exception
}

JFileChooser chooser = new JFileChooser(); 
//etc
}
于 2010-02-17T16:15:11.080 に答える
4

問題は、電話をかけたときにルックアンドフィールがすでに選択されていることですsuper(path)

ルックアンドフィールのJavaチュートリアルから:

:L&Fを設定する場合は、アプリケーションの最初のステップとして設定する必要があります。そうしないと、要求したL&Fに関係なく、Java L&Fを初期化するリスクがあります。これは、静的フィールドがSwingクラスを参照している場合に誤って発生する可能性があり、これによりL&Fがロードされます。L&Fがまだ指定されていない場合は、JREのデフォルトのL&Fがロードされます。SunのJREの場合、デフォルトはJava L&F、AppleのJREの場合はApple L&Fなどです。

修正するには、これを行う必要があります(説明はここにあります)-try/catchブロックを次のコードに置き換えます。

UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
SwingUtilities.updateComponentTreeUI(this);
this.pack();
于 2010-02-17T16:28:15.847 に答える
4

メインメソッドの最初にこれを試してください。または、netbeansまたはeclipse windowbuilderで生成されたコードを使用している場合は、生成されたコードの前にこれを配置します。

try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } 
catch (UnsupportedLookAndFeelException e) {}
catch (ClassNotFoundException e) {}
catch (InstantiationException e) {}
catch (IllegalAccessException e) {}
于 2013-07-29T17:35:00.533 に答える
1

UIManager.setLookAndFeel(...);前に説明したように、メインのメソッドの早い段階で使用するのが最もクリーンなアプローチですが、広範なテストを行わずに既存のアプリケーションに追加する場合は十分に注意してください。

たとえば、LAFWindowsLookAndFeelに変更して(JFileChooserが「MyDocuments」が実際には「Documents」という名前のフォルダーを参照していることを認識できるように)、次の行のために別のモジュールで NullPointerExceptionをヒットしました。

int separatorWidth = (new JToolBar.Separator()).getSeparatorSize().width;
于 2016-01-20T01:59:49.673 に答える
0

これが必要な場合-> Windowsのルックアンドフィールサンプル

以下のコードを使用できます(あまりにも)!

楽しむ!

JFrame w = new FileExplorerJFrame();

    try {
        UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
    } catch (ClassNotFoundException ex) {
        Logger.getLogger(ExcelTest.class.getName()).log(Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        Logger.getLogger(ExcelTest.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        Logger.getLogger(ExcelTest.class.getName()).log(Level.SEVERE, null, ex);
    } catch (UnsupportedLookAndFeelException ex) {
        Logger.getLogger(ExcelTest.class.getName()).log(Level.SEVERE, null, ex);
    }
    SwingUtilities.updateComponentTreeUI(w);

    w.pack();
    w.setVisible(true);
于 2015-11-21T02:29:30.970 に答える
-1

開始するには:

String path = null;
FileChooser fc=new FileChooser(path);
fc.showOpenDialog(null);

次に、別のクラスで:

public FileChooser(){
    this(null);
}

public  FileChooser(String path) {
    super(path);
    try {
        UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        SwingUtilities.updateComponentTreeUI(this);
        this.pack();
    } catch (Exception ex) {
        Logger.getLogger(FileChooser.class.getName()).log(Level.SEVERE, null, ex);
    }

    JFileChooser chooser = new JFileChooser();
}

private void pack() {
    try{
    }catch(UnsupportedOperationException eu){
    };
}
于 2012-05-30T17:40:33.960 に答える