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

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