2011-01-22 22 views

答えて

3

私はあなたが大きなチェックボックスをオンにしたい意味を前提としています。その場合は、チェックボックスの選択されていない選択アイコンを表すイメージを作成する必要があります。次に、これらのアイコンを使用してレンダラーとエディタを作成できます。最後に、表の各行の高さを増やす必要があります。

Icon normal = new ImageIcon(...); 
Icon selected = new ImageIcon(...); 
JTable table = new JTable(...); 
table.setRowHeight(...); 

TableCellRenderer renderer = table.getDefaultRenderer(Boolean.class); 
JCheckBox checkBoxRenderer = (JCheckBox)renderer; 
checkBoxRenderer.setIcon(normal); 
checkBoxRenderer.setSelectedIcon(selected); 

DefaultCellEditor editor = (DefaultCellEditor)table.getDefaultEditor(Boolean.class); 
JCheckBox checkBoxEditor = (JCheckBox)editor.getComponent(); 
checkBoxEditor.setIcon(normal); 
checkBoxEditor.setSelectedIcon(selected); 
+0

私はBoolean.class列に自分のレンダラを持っている..しかし、私は、アイコンを設定すると、それは表示されませんし、私はそれをクリックしたとき、それは短い第二の通常のチェックボックスを表示します。.. –

+0

はい、クリックすると、カスタムレンダラとエディタの両方が必要な「エディタ」が表示されます。アイコンが表示されない場合、カスタムコードは機能しません。最初にコンセプトを理解するには、デフォルトのレンダラーとエディタを使用してみてください。カスタムレンダラとエディタが必要な場合は、両方を変更することができます。 – camickr

+0

しかし、私はもう一度defaultcelleditorを設定する必要がありますか? –

3

重要な注意:コードは次のようになりますこれはデフォルトの「メタル」ルックアンドフィールで試験しました。私はこれが他のルック・アンド・フィールでも動作するとは保証しません。また、私はそれが正当にハックのビットですので、どのように動作するのか完全にはわかりません。

私は少し違った方法でこれを解決することができました。

私は既存の画像を使い、それにスケールを適用したかったのです。私はすでにUIのデフォルトを使ってアプリケーションのフォントを拡大しているので、かなり大きなフォントを持っています。私はそれを活用し、それに応じてチェックボックスを拡大することができるのだろうかと思った。インターネットを精練、私はこの方法を思い付いたものの束を試した後

public static void scaleCheckBoxIcon(JCheckBox checkbox){ 
    boolean previousState = checkbox.isSelected(); 
    checkbox.setSelected(false); 
    FontMetrics boxFontMetrics = checkbox.getFontMetrics(checkbox.getFont()); 
    Icon boxIcon = UIManager.getIcon("CheckBox.icon"); 
    BufferedImage boxImage = new BufferedImage(
     boxIcon.getIconWidth(), boxIcon.getIconHeight(), BufferedImage.TYPE_INT_ARGB 
    ); 
    Graphics graphics = boxImage.createGraphics(); 
    try{ 
     boxIcon.paintIcon(checkbox, graphics, 0, 0); 
    }finally{ 
     graphics.dispose(); 
    } 
    ImageIcon newBoxImage = new ImageIcon(boxImage); 
    Image finalBoxImage = newBoxImage.getImage().getScaledInstance(
     boxFontMetrics.getHeight(), boxFontMetrics.getHeight(), Image.SCALE_SMOOTH 
    ); 
    checkbox.setIcon(new ImageIcon(finalBoxImage)); 

    checkbox.setSelected(true); 
    Icon checkedBoxIcon = UIManager.getIcon("CheckBox.icon"); 
    BufferedImage checkedBoxImage = new BufferedImage(
     checkedBoxIcon.getIconWidth(), checkedBoxIcon.getIconHeight(), BufferedImage.TYPE_INT_ARGB 
    ); 
    Graphics checkedGraphics = checkedBoxImage.createGraphics(); 
    try{ 
     checkedBoxIcon.paintIcon(checkbox, checkedGraphics, 0, 0); 
    }finally{ 
     checkedGraphics.dispose(); 
    } 
    ImageIcon newCheckedBoxImage = new ImageIcon(checkedBoxImage); 
    Image finalCheckedBoxImage = newCheckedBoxImage.getImage().getScaledInstance(
     boxFontMetrics.getHeight(), boxFontMetrics.getHeight(), Image.SCALE_SMOOTH 
    ); 
    checkbox.setSelectedIcon(new ImageIcon(finalCheckedBoxImage)); 
    checkbox.setSelected(false); 
    checkbox.setSelected(previousState); 
} 

それは何がチェックボックスのフォントメトリックスからフォントのサイズを取得することです。次に、それを使用して、「ルックアンドフィール」にあるアイコンに基づいて新しいアイコンを派生させます。

私が説明することができない奇妙なことは、チェックボックスのアイコンが「選択されていない」状態またはデフォルトの状態でどのように「選択」アイコンに変更され、 1。

コントロールの状態を保存することから始めて、最後に復元することができます。これは、アイコンが適切に設定されるためには、UIManagerからアイコンを最初に要求するときに状態をチェック解除する必要があるため、次にアイコンを要求するときにチェックする必要があります。 'アイコンをクリックします。

UIManagerの仕組みや、単一のチェックボックスの 'selected'値を設定するだけで同じプロパティを呼び出すときにチェックボックスのアイコンが変化する理由は完全にはわかりませんが、両方とも取得するために必要です必要なアイコン。

フォントのサイズを基準にしたくない場合は、パラメータとして高さと幅を渡し、バッファされたイメージサイズを設定するときにフォントの高さの代わりに使用するだけです。

I might mention that this same methodology works with radiobuttons

+0

素晴らしい仕事、ありがとう!私はWindowsのルック・アンド・フィールを使用しています。唯一の欠点は、通常のWindows 7のチェックボックスで得られる「マウスオーバー」効果が得られないことです。通常は、チェックボックスをポイントすると青色に輝きます。しかし、このスケーリング方法を使用すると、その効果は失われます。 – Michael

関連する問題