8

JDK 7は、JColorChooserに新しい透明度スライダーを追加しました。

ここに画像の説明を入力してください

問題は、ユーザーが透明な色を選択できるようにしたくないということです。残念ながら、スライダーを無効にする簡単な方法はないようです。

透明度を取り除く1つの方法は、選択した色に基づいて新しい色を作成し、アルファ値を削除することです。ただし、スライダーは効果的に何も実行しないため、これはユーザーに誤った印象を与えます。無駄なUI要素を配置するのは嫌です。

だから私の質問は、透明度スライダーを取り除くための最良の方法は何ですか?

PS:IMO、スライダーを追加してデフォルトの動作にするのはおかしいです。これにより、カラーチューザがアルファ値の色を返すことを期待しないJDK6プログラムで多くのバグが発生する可能性があります。

4

5 に答える 5

5

ドキュメントによると、既存のクラスを変更/構成するだけで済みます。したがって、推奨される方法は、独自のChooserPanel(拡張する必要がありますAbstractColorChooserPanel)を作成してから呼び出すことです。

JColorChooser jc = new JColorChooser();
jc.setChooserPanels(new AbstractColorChooserPanel[]{yourChooserPanel});

あるいは、あなたがそれを行うためのより速く/より厄介な/より醜い方法を探しているなら、あなたのためにこれを書きました:

private static void removeTransparencySlider(JColorChooser jc) throws Exception {

    AbstractColorChooserPanel[] colorPanels = jc.getChooserPanels();
    for (int i = 1; i < colorPanels.length; i++) {
        AbstractColorChooserPanel cp = colorPanels[i];

        Field f = cp.getClass().getDeclaredField("panel");
        f.setAccessible(true);

        Object colorPanel = f.get(cp);
        Field f2 = colorPanel.getClass().getDeclaredField("spinners");
        f2.setAccessible(true);
        Object spinners = f2.get(colorPanel);

        Object transpSlispinner = Array.get(spinners, 3);
        if (i == colorPanels.length - 1) {
            transpSlispinner = Array.get(spinners, 4);
        }
        Field f3 = transpSlispinner.getClass().getDeclaredField("slider");
        f3.setAccessible(true);
        JSlider slider = (JSlider) f3.get(transpSlispinner);
        slider.setEnabled(false);
        Field f4 = transpSlispinner.getClass().getDeclaredField("spinner");
        f4.setAccessible(true);
        JSpinner spinner = (JSpinner) f4.get(transpSlispinner);
        spinner.setEnabled(false);
    }
}

それで頑張ってください:)

于 2012-08-19T14:57:20.077 に答える
3

実装に依存しますがAbstractColorChooserPanel、名前での具体的なサブクラスを削除できます。

この例では、RGBパネル以外のすべてを削除します。

AbstractColorChooserPanel[] ccPanels = chooser.getChooserPanels();
for (AbstractColorChooserPanel ccPanel : ccPanels) {
    System.out.println(ccPanel.getDisplayName());
    String name = ccPanel.getClass().getSimpleName();
    if (!"DefaultRGBChooserPanel".equals(name))
        tcc.removeChooserPanel(ccPanel);
}

この例では、HSBパネルを復元します。

for (AbstractColorChooserPanel ccPanel : ccPanels) {
    String name = ccPanel.getClass().getSimpleName();
    if ("DefaultHSBChooserPanel".equals(name))
        tcc.addChooserPanel(ccPanel);
}

経験的に目的の名前を決定する必要があります。

于 2012-08-19T15:20:49.857 に答える
1

これは、無効にするのではなく、それらを完全に非表示にするaymericの回答のわずかな変更です。

private static void removeTransparencySlider(JColorChooser jc) throws Exception {

    AbstractColorChooserPanel[] colorPanels = jc.getChooserPanels();
    for (int i = 1; i < colorPanels.length; i++) {
        AbstractColorChooserPanel cp = colorPanels[i];

        Field f = cp.getClass().getDeclaredField("panel");
        f.setAccessible(true);

        Object colorPanel = f.get(cp);
        Field f2 = colorPanel.getClass().getDeclaredField("spinners");
        f2.setAccessible(true);
        Object spinners = f2.get(colorPanel);

        Object transpSlispinner = Array.get(spinners, 3);
        if (i == colorPanels.length - 1) {
            transpSlispinner = Array.get(spinners, 4);
        }
        Field f3 = transpSlispinner.getClass().getDeclaredField("slider");
        f3.setAccessible(true);
        JSlider slider = (JSlider) f3.get(transpSlispinner);
        slider.setEnabled(false);
        slider.setVisible(false);
        Field f4 = transpSlispinner.getClass().getDeclaredField("spinner");
        f4.setAccessible(true);
        JSpinner spinner = (JSpinner) f4.get(transpSlispinner);
        spinner.setEnabled(false);
        spinner.setVisible(false);

        Field f5 = transpSlispinner.getClass().getDeclaredField("label");
        f5.setAccessible(true);
        JLabel label = (JLabel) f5.get(transpSlispinner);
        label.setVisible(false);
    }
}
于 2014-03-24T12:03:09.763 に答える
1

ここでの他の回答は、JColorChooserのインスタンスから透明度スライダーを削除する方法を示していますが、JColorChooserを使用する主な方法は静的showDialogメソッドです。この場合、インスタンスにアクセスできません。したがって、2つのメソッドを紹介します。1つはJColorChooserのインスタンスからコントロールを非表示にするメソッドで、もう1つは追加のパラメーターとしてshowDialogそのためのドロップイン置換メソッドです。showTransparencyControls

import java.awt.*;
import java.awt.event.ActionListener;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import javax.swing.*;
import javax.swing.colorchooser.AbstractColorChooserPanel;

class SwingUtil {
    /**
     * Hides controls for configuring color transparency on the specified
     * color chooser.
     */
    public static void hideTransparencyControls(JColorChooser cc) {
        AbstractColorChooserPanel[] colorPanels = cc.getChooserPanels();
        for (int i = 0; i < colorPanels.length; i++) {
            AbstractColorChooserPanel cp = colorPanels[i];
            try {
                Field f = cp.getClass().getDeclaredField("panel");
                f.setAccessible(true);
                Object colorPanel = f.get(cp);

                Field f2 = colorPanel.getClass().getDeclaredField("spinners");
                f2.setAccessible(true);
                Object sliders = f2.get(colorPanel);

                Object transparencySlider = java.lang.reflect.Array.get(sliders, 3);
                if (i == colorPanels.length - 1)
                    transparencySlider = java.lang.reflect.Array.get(sliders, 4);

                Method setVisible = transparencySlider.getClass().getDeclaredMethod(
                    "setVisible", boolean.class);
                setVisible.setAccessible(true);
                setVisible.invoke(transparencySlider, false);
            } catch (Throwable t) {}
        }
    }


    /**
     * Shows a modal color chooser dialog and blocks until the dialog is
     * closed.
     * 
     * @param component the parent component for the dialog; may be null
     * @param title the dialog's title
     * @param initialColor the initial color set when the dialog is shown
     * @param showTransparencyControls whether to show controls for
     *        configuring the color's transparency
     * @return the chosen color or null if the user canceled the dialog
     */
    public static Color showColorChooserDialog(Component component,
            String title, Color initialColor, boolean showTransparencyControls) {
        JColorChooser pane = new JColorChooser(
            initialColor != null ? initialColor : Color.white);
        if (!showTransparencyControls) hideTransparencyControls(pane);
        Color[] result = new Color[1];
        ActionListener okListener = e -> result[0] = pane.getColor();
        JDialog dialog = pane.createDialog(component, title, true, pane, okListener, null);
        dialog.setVisible(true);
        dialog.dispose();
        return result[0];
    }
}
于 2014-07-21T22:01:29.687 に答える
0

Java 9は、これらのスライダーを制御するための新しいプロパティを追加します。AbstractColorChooserPanel

public void setColorTransparencySelectionEnabled(boolean b);
public boolean isColorTransparencySelectionEnabled();

JColorChooser.showDialog同じプロパティを指定するための静的メソッドの新しいオーバーロードもあります。

public static Color showDialog(Component component, String title, Color initialColor,
    boolean colorTransparencySelectionEnabled);

Java9は2017年3月にリリースされる予定です。

于 2016-05-01T03:34:14.727 に答える