Проблема Java Swing - Использование цветовой палитры - PullRequest
2 голосов
/ 17 декабря 2011

У меня проблема здесь - у меня шестнадцатеричное значение сохраняется в текстовом поле после того, как я выбрал цвет (используя JColorChooser). Я хотел бы отобразить имя цвета в другом текстовом поле рядом с полем с шестнадцатеричным значением, но я не уверен, как получить имя цвета? Я включаю свой код, может быть, кто-то может дать мне несколько полезных советов:

public class Main extends JComponent implements Accessible {
    public ColorSelectionModel selectionModel;
    public static final String SELECTION_MODEL_PROPERTY = "selectionModel";
    public JColorChooser chooser;
    public Color color;

    public void process() {
        JFrame frame;
        JButton button;
        final JTextField text1, text2;

        // Initialize variables
        chooser = new JColorChooser();
        frame = new JFrame();
        JPanel panel = new JPanel();
        button = new JButton("Show color Palette");
        text1 = new JTextField(20);
        text2 = new JTextField(20);

        // Setup UI
        frame.add(panel);
        panel.add(button);
        panel.add(text1);
        panel.add(text2);
        panel.add(chooser)
        chooser.setVisible(false);

        button.setLocation(800, 600);
        button.setActionCommand("");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                color = chooser.showDialog(chooser, "SHOW THE COLOR",
                        chooser.getColor());
                {
                    if (color != null) {
                        String hex = Integer.toHexString(color.getRGB() & 0xffffff);
                        hex = "#" + hex;
                        text1.setText(hex);
                    }
                }
            }
        });

        frame.setVisible(true);
        frame.setSize(1000, 800);
    }

    public static void main(String[] argv) {
        // Run the code
        Main m1 = new Main();
        m1.process();
    }
}

Ответы [ 5 ]

2 голосов
/ 17 декабря 2011

Для палитры fixed разумным выбором является enum, показанный в контексте здесь :

private enum Hue {

    Cyan(Color.cyan), Magenta(Color.magenta), Yellow(Color.yellow),
    Red(Color.red), Green(Color.green), Blue(Color.blue);

    private final Color color;

    private Hue(Color color) {
        this.color = color;
    }

    public Color getColor() {
        return color;
    }
}

Для переменной палитра, вам нужно определить структуру данных, которая связывает цвет и имя, например Map<Color, String>.Вы также можете посмотреть Как использовать средства выбора цвета: создание панели пользовательского выбора .Наконец, вы можете рассмотреть возможность использования существующих стандартных имен цветов .

2 голосов
/ 17 декабря 2011

Я нашел эту тему по ссылке mKorbel на мой Интерактивный цветной круг . Апплет включает в себя порт Java и расширение библиотеки Name That Color Javascript от Chirag Mehta. Поскольку в конечном итоге я добавил возможность иметь несколько словарей имен цветов, я удалил фактические пары шестнадцатеричных / имен из исходного кода и добавил их в качестве файлов свойств. Вам нужны только первые два файла, если вам нужен только словарь цветовых имен Чирага (путаница из нескольких небольших словарей).

NTC.java записывается с помощью метода main(), чтобы его можно было проверить автономно в командной оболочке:

>java us.r0k.ntc.NTC 28f369
>  #0BDA51, Malachite, false

Первое значение - это ближайший гекс к желаемому гексу, второе - имя цвета для этого значения, а третье указывает, что точное совпадение не найдено.

Вы также можете указать второй параметр, имя словаря имен цветов (по умолчанию это «cnd_ntc.properties»).

2 голосов
/ 17 декабря 2011

RGB - не самая лучшая цветовая модель для работы в этой ситуации. HSB будет более подходящим.

  1. Конвертировать RGB в HSB:

    float[] hsb = Color.RGBtoHSB(red, green, blue, null);
    
  2. Определить цвет:

    String color;
    
    if (hsb[0] >= 0.0 && ksb[0] <= 0.1) {
        color = "Red";
    } else if (hsb[0] > 0.1 && ksb[0] <= 0.25) {
        color = "Orange";
    } else if (hsb[0] > 0.25 && ksb[0] <= 0.35) {
        color = "Yellow";
    } ...
    
1 голос
/ 24 декабря 2011

Я достиг этого с помощью Java Reflection: (работает для static final Color, определенного в java.awt.Color)

Вот мой код:

public static String getNameReflection(Color colorParam) {
        try {
            //first read all fields in array
            Field[] field = Class.forName("java.awt.Color").getDeclaredFields();
            for (Field f : field) {
                String colorName = f.getName();
                Class<?> t = f.getType();
                // System.out.println(f.getType());
                // check only for constants - "public static final Color"
                if (t == java.awt.Color.class) {
                    Color defined = (Color) f.get(null);
                    if (defined.equals(colorParam)) {
                        System.out.println(colorName);
                        return colorName.toUpperCase();
                    }
                }
            }
        } catch (Exception e) {
            System.out.println("Error... " + e.toString());
        }
        return "NO_MATCH";
    }

Источник: http://ganeshtiwaridotcomdotnp.blogspot.com/2011/12/java-reflection-getting-name-of-color.html

0 голосов
/ 13 ноября 2013
public void updateChooser() {
    Color color = getColorFromModel();
    if (Color.red.equals(color)) {
        redCrayon.setSelected(true);
    } else if (Color.yellow.equals(color)) {
        yellowCrayon.setSelected(true);
    } else if (Color.green.equals(color)) {
        greenCrayon.setSelected(true);
    } else if (Color.blue.equals(color)) {
        blueCrayon.setSelected(true);
    }
}

Проверка включена http://docs.oracle.com/javase/tutorial/uiswing/components/colorchooser.html#chooserpanel

...