JFileChooserのフォント/アイコンを拡大したい(1)
2018年、あけましておめでとうございます。
当ブログに「JFileChooserの拡大についての質問」というコメントを
頂きました。 コメント元の記事とは関係しないので別記事として
ここに掲載します。
JFileChooserの拡大についての質問
ディスプレイの解像度の拡大に伴いJFileChooserを呼び出しても通常ではサイズが小さいために任意の大きさに拡大表示する方法で悩んでいます。
以下のコードではJFileChooserのフォントサイズの拡大やボタンの拡大は出来たのですが、アイコンの拡大が出来ていない状態です。以下デフォルトLook&Feel。
○左の3つはImageIconつきのJButton。フォントの変更同様、JButtonを拾ってJButton#getIcon()⇒ImageIcon#getImage()。ImageIcon#setImage(Image#getScaledInstance())で大きくできた。
○右の2つはJToggleButtonだが、アイコンはMetalIconFactory.FileChooserListViewIcon、MetalIconFactory.FileChooserDetailViewIconというベタ書きIcon(#paintIcon()でGraphics#drawLine()しまくってる。サイズも「18」固定)のシングルトンだった。これをどうこうするよりは、自分でアイコンを用意する方が楽だと思う。以下WindowsのLook&Feel。
○ボタンは3つともJToggleButtonで、それぞれImageIconなので上と同じ方法で大きくできた。AbstractButtonで取ればJButtonもJToggleButtonも拾える。という上記の意見をいただいたことがあるのですが、文中の「#」が何を意味するのかもわかりませんし、また自力で何度もコードを書いてみましたがアイコンを拡大することが出来ません。
どうか教えて下さい。よろしくお願いします。
//ダイアログのフォントサイズ
private Font font = AllFont.getFontSizeB50();
// ファイルチューザーを初期状態ではローカルディスク「C:」を表示
File dir = new File("c:\\");
JFileChooser fch = new JFileChooser(dir);
//ダイアログのサイズ変更
fc.setPreferredSize(new Dimension(1320,800));
//ダイアログのフォントサイズ変更
setFileChooserFont(fc.getComponents());
//ダイアログのボタンサイズ変更
setJButtonsize(filechooser);
//アイコン付きのボタン5種類のアイコンサイズの変更
private void setJButtonsize(Container c) {
int len = c.getComponentCount();
for (int i = 0; i &lh; len; i++) {
Component comp = c.getComponent(i);
if (comp instanceof JButton) {
JButton b = (JButton) comp;
Icon icon = b.getIcon();
System.out.println("アイコンサイズは" + icon + "です。");
//ボタンサイズ
b.setMaximumSize(new Dimension(200,100));
if (icon != null) {
//新規フォルダアイコン
if( icon == UIManager.getIcon("FileChooser.newFolderIcon")) {
System.out.println("FileChooser.newFolderIconです。");
int ix = icon.getIconHeight();
int iy = icon.getIconHeight();
System.out.println("アイコンサイズは" + ix+","+ iy + "です。");//ix=16, iy = 16
//ホームアイコン
}else if( icon == UIManager.getIcon("FileChooser.homeFolderIcon")){
//一つ上へアイコン
}else if( icon == UIManager.getIcon("FileChooser.upFolderIcon")){
}
}
}else if (comp instanceof AbstractButton) {
AbstractButton ac = (AbstractButton) comp;
Icon iconb = ac.getIcon();
ac.setMaximumSize(new Dimension(200,100));
if (iconb != null) {
//詳細アイコン
if( iconb == UIManager.getIcon("FileChooser.detailsViewIcon")){
//リストアイコン
}else if( iconb == UIManager.getIcon("FileChooser.listViewIcon")){
}
}
} else if (comp instanceof Container) {
setJButtonsize((Container) comp);
}
}
}
//ファイルチューザーのフォントのサイズ変更
private void setFileChooserFont(Component[] comp){
for(int x = 0; x < comp.length; x++) {
if(comp[x] instanceof Container) setFileChooserFont(((Container)comp[x]).getComponents());
try{
//フォントサイズ変更
comp[x].setFont(font);
//ボタンサイズ変更
}catch(Exception e){
}//do nothing
}
}
}
if 文の{}の中が空っぽの部分は、どう書いたらよいかわからない
ということなんでしょうね。
1番簡単なのは、Windows10であれば「システム:ディスプレイ:
拡大縮小とレイアウト」の「テキスト、アプリ、 その他の項目の
サイズを変更する」で、倍率を150% とか 200% にすることだと
思うのですが
それを言ってしまうとプログラミングの勉強にはならないので(^^)
少々解説しましょう。
まず
文中の「#」が何を意味するのかもわかりません
ですが、これは クラス名#メソッド名 のことです。例えば
JButton#getIcon() は
JButton クラスの getIcon() メソッドを使う
という意味です。
実際のコードは
JButton jb=new JButton(icon,text); ImageIcon ii = (ImageIcon)((AbstractButton)jb).getIcon();
などになり、jb.getIcon(); のように インスタンス.メソッド名 と
# ではなくて . 区切りになります。
長くなったので、続きは別エントリにします。

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