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(); } }
この記事へのコメントはこちら