JFileChooserのフォント/アイコンを拡大したい(2)

 

JFileChooserのフォント/アイコンを拡大したい(1)の続きです。

書かれているコードは
void setFileChooserFont(Component[] comp)
というメソッドを作って、そこに
JFileChooseの構成部品(コンポーネント)を与えて
それぞれのフォントを setFont() で変更しているようです。

setFileChooserFont() の中で setFileChooserFont()、即ち
自分自身を呼んでいるのは「再帰」で
コンポーネントの中にコンテナ(入れ物)があったら
そのコンテナを getComponents() でバラして、その中身に
対して setFont() をするようにしています。

JButtonを拾ってJButton#getIcon()⇒ImageIcon#getImage()。
ImageIcon#setImage(Image#getScaledInstance())で大きくできた。

を素直に実装すると

if (comp[x] instanceof JButton) {  // コンポーネントが JButtonだったら
  ImageIcon ii=(ImageIcon)((AbstractButton) comp[x]).getIcon();
  if (ii!=null) {
    Image im=ii.getImage();
    ii.setImage(im.getScaledInstance(32, 32, Image.SCALE_SMOOTH));
    ((JButton)comp[x]).setIcon(ii);
  }
}

という感じになると思います。
getScaledInstance() に与えている 32,32 は拡大後のサイズとして
指定した適当な値で、深い意味はありません。

○右の2つはJToggleButtonだが ..中略..
サイズも「18」固定)のシングルトンだった。

ということなので、この2つのアイコンは拡大できないという
ことのようですね。

管理人イガジーが手を入れたコードを以下に掲載します。
(JFChooserEX というクラス名にしています)

// JFileChooserのサンプルコード 20180109 by MLTLab.com

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Font;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.AbstractButton;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.plaf.FontUIResource;

public class JFChooserEx {
  final int fsz=24, isz=32;
  JFrame jf;
  JLabel lb=new JLabel("Selected Filename");
  JButton btn=new JButton("FileChoose");
  JFileChooser jfc;
  FontUIResource bigfont=new FontUIResource(Font.MONOSPACED,Font.PLAIN,fsz);

  private void setFileChooserFont(Component[] comp) {
    for (int x = 0; x < comp.length; x++) {
      if (comp[x] instanceof Container)
        setFileChooserFont(((Container) comp[x]).getComponents()); // 再帰

      comp[x].setFont(bigfont);

    /* 左の3つはImageIconつきのJButton */
      if (comp[x] instanceof JButton) {
        ImageIcon ii=(ImageIcon)((AbstractButton) comp[x]).getIcon();
        if (ii!=null) {
          Image im=ii.getImage();
          ii.setImage(im.getScaledInstance(isz, isz, Image.SCALE_SMOOTH));
          ((JButton)comp[x]).setIcon(ii);
        }
      } // end if JButton
    /* 右の2つは変更できないようだ */
    }// for
  }// setFileChooserFont()

/////////////////////////////////////////////////////////////////////////
  JFChooserEx() { // constructor
    jf=new JFrame("JFChooserExample");
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    jfc=new JFileChooser();
    setFileChooserFont(jfc.getComponents());

    btn.addActionListener(new ActionListener(){
      @Override
      public void actionPerformed(ActionEvent arg0) {
        int r=jfc.showOpenDialog(jf);
        if (r==JFileChooser.APPROVE_OPTION) {
          String fname=jfc.getSelectedFile().getPath();
          lb.setText(fname);
        }
      }
    });

    jf.add(lb,BorderLayout.CENTER);
    jf.add(btn,BorderLayout.SOUTH);

    jf.setSize(400,160);
    jf.setVisible(true);
  }

  public static void main(String[] args) {
    new JFChooserEx();
  }
}

この記事へのコメントはこちら

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。