Java
 Computer >> コンピューター >  >> プログラミング >> Java

【Java】JComboBoxの各項目にさまざまなフォントを表示する方法

JComboBoxJComponentクラスのサブクラスであり、テキストフィールドとドロップダウンリストを組み合わせたSwingコンポーネントです。ユーザーはこのリストから任意の値を選択できます。また、コンボボックスに対するユーザーの操作に応じて、ActionListenerChangeListenerItemListenerなどのイベントを受け取ることも可能です。

JComboBoxの各項目にそれぞれ異なるフォントスタイルを表示したい場合は、ListCellRendererインターフェースを実装したカスタムレンダラーを使用します。これにより、ドロップダウンリスト内の各項目を、その項目名のフォントそのもので描画できるようになります。

実装例

以下の例では、システムで利用可能なすべてのフォントファミリー名を取得し、コンボボックスの各項目を対応するフォントでプレビュー表示しています。

import java.awt.*;
import javax.swing.*;

public class JComboBoxFontTest extends JFrame {
   private JComboBox fontComboBox;
   private String fontName[];
   private Integer array[];

   public JComboBoxFontTest() {
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      // システムで利用可能なフォントファミリー名を取得
      GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
      fontName = ge.getAvailableFontFamilyNames();
      array = new Integer[fontName.length];
      for(int i = 1; i <= fontName.length; i++) {
         array[i-1] = i;
      }
      fontComboBox = new JComboBox(array);
      // カスタムレンダラーを設定
      ComboBoxRenderar renderar = new ComboBoxRenderar();
      fontComboBox.setRenderer(renderar);
      setLayout(new FlowLayout());
      add(fontComboBox);
      setSize(400, 300);
      setLocationRelativeTo(null);
      setVisible(true);
   }

   private class ComboBoxRenderar extends JLabel implements ListCellRenderer {
      @Override
      public Component getListCellRendererComponent(JList list, Object value,
            int index, boolean isSelected, boolean cellHasFocus) {
         int offset = ((Integer)value).intValue() - 1;
         String name = fontName[offset];
         setText(name);
         // 各項目をそのフォント自体で描画する
         setFont(new Font(name, Font.PLAIN, 20));
         return this;
      }
   }

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

実行結果

【Java】JComboBoxの各項目にさまざまなフォントを表示する方法

ポイント解説

  • フォント一覧の取得: GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames() を呼び出すことで、実行環境で使用できるすべてのフォントファミリー名を配列として取得できます。
  • カスタムレンダラーの作成: ListCellRenderer インターフェースを実装したクラス(ここでは内部クラス ComboBoxRenderar)を作成し、getListCellRendererComponent() メソッドをオーバーライドします。
  • 項目ごとの描画: オーバーライドしたメソッド内で setText() により項目名を設定し、setFont(new Font(name, Font.PLAIN, 20)) によってそのフォント自体で文字を描画することで、フォントの見た目を直接プレビューできます。
  • レンダラーの適用: setRenderer() メソッドを使ってカスタムレンダラーをJComboBoxに登録すると、ドロップダウンリストの全項目に反映されます。

この手法を応用すれば、フォント選択ダイアログやエディターのスタイル設定画面など、視覚的に分かりやすいUIを簡単に構築できます。

  1. JavaのBorderFactoryを使ってさまざまなボーダー(境界線)を実装する方法

    BorderFactoryは、Javaでさまざまな種類のボーダー(境界線)を生成するためのファクトリクラスです。このクラスを利用することで、Swingコンポーネントの外枠を簡単かつ柔軟にカスタマイズできます。ボーダーの種類BevelBorder:浮き上がった(RAISED)または沈み込んだ(LOWERED)斜めのエッジを描画します。ボタンなどに立体感を持たせたい場合に有効です。EmptyBorder:何も描画しませんが、余白としてスペースを確保します。コンポーネント間の間隔調整に役立ちます。EtchedBorder:LOWERED(沈み込み)タイプはくぼんだ矩形のような外観になり、RAISED

  2. JavaでJTextFieldに入力できる文字数を制限する方法(PlainDocument活用)

    JTextFieldは、Swingアプリケーションにおいてユーザーにテキストを1行形式で入力させるための、最も重要なコンポーネントの一つです。フォームや検索ボックスなど、さまざまな場面で利用されますが、場合によっては「入力できる文字数に上限を設けたい」という要件が発生します。このような文字数制限は、PlainDocumentクラスを継承したカスタムドキュメントを作成することで簡単に実現できます。ドキュメントはJTextFieldの内部でテキストデータを管理する役割を持つため、ここで挿入処理を制御すれば、上限を超える文字入力を防ぐことが可能です。実装のポイントPlainDocumentを継承した