Как использовать JColorChooser данного цвета в других классах?

Я изучаю Java всего несколько недель, так что имейте это в виду... Мне удалось решить многие проблемы самостоятельно, пока эта проблема:

Я пытаюсь добиться использования JComponent в представлении с вкладками, чтобы на одной вкладке вы могли выбрать цвет (мой println показывает, что он на самом деле получает значение sRGB). Затем в другом классе я смогу получить это значение и использовать его для раскрашивания JPanels. Могу ли я просто передать объект Color или какой лучший способ достичь. То, что я пытаюсь здесь, не работает слишком хорошо. Извините за грязный код - я новичок... Вот основная часть выбора цвета:

public class Colors extends JPanel implements ChangeListener {

    private JColorChooser jcc = null;
    protected JLabel title;
    static Color newColor;

    public Colors() {
        super(new BorderLayout());

        //Set up the banner at the top of the window
        title = new JLabel();

        //Set up color chooser for setting text color
        jcc = new JColorChooser(title.getForeground());
        jcc.getSelectionModel().addChangeListener(this);
        jcc.setBorder(BorderFactory.createTitledBorder(
                "Choose New Color"));

        AbstractColorChooserPanel[] panels=jcc.getChooserPanels();
        for(AbstractColorChooserPanel p:panels) {
            String displayName = p.getDisplayName();
            switch (displayName) {
                case "HSV":
                    jcc.removeChooserPanel(p);
                    break;
                case "HSL":
                    jcc.removeChooserPanel(p);
                    break;
                case "CMYK":
                    jcc.removeChooserPanel(p);
                    break;
                case "RGB":
                    jcc.removeChooserPanel(p);
                    break;
            }
        }
        add(jcc, BorderLayout.PAGE_END);
    }



    public void stateChanged(ChangeEvent e) {
        Color newColor = jcc.getColor();
        title.setForeground(newColor);
        System.out.println("color = " + newColor);
    }

    public static Color getNewCol() {
        System.out.println("this now =" + newColor);
        return newColor;
    }

    public static Component createAndShowGUI() {
        //Create and set up the window.
        JFrame frame = new JFrame("Color Selector");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        //Create and set up the content pane.
        JComponent newContentPane = new Colors();
        return newContentPane;

    }
}

И затем я пытаюсь получить выбранный цвет в классе Main.Java таким образом (что, вероятно, неправильно). Я также отмечаю, что значение, кажется, всегда остается нулевым - возможно, я создаю экземпляр неправильно (значение теряется?)

a.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("Click add");
                value++;

                if (value < 21) {


                    JButton jb1 = new JButton();

                    //How to get the COLOR from the JColorChooser class?
                    Color box = Colors.getNewCol();

                    jb1.setBackground(box);
                    jb1.setOpaque(true);

                    //FOR TEST ONLY jb1.setBackground(Color.BLUE);
                    panel.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
                    panel.add(jb1);
                    panel.setVisible(true);

                    //window.add(paneeli);

                    window.pack();

                    d = new Dimension(700, 500);
                    window.setSize(d);

Возможно, ответ слишком очевиден, но я просто не вижу его в данный момент.

1 ответ

Я бы взял вашу статическую переменную newColor и сделал бы ее нестатичной. В моем ChangeListener я бы запустил врожденный PropertyChangeSupport JPanel, чтобы слушатели могли получать уведомления. Ключ должен использовать шаблон проектирования наблюдателя - Например:

import java.awt.BorderLayout;
import java.awt.Color;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.*;
import javax.swing.event.*;

@SuppressWarnings("serial")
public class TestColors extends JPanel {
    private JTabbedPane tabbedPane = new JTabbedPane();
    private Colors colors = new Colors();
    private JPanel colorDisplayPanel = new JPanel();

    public TestColors() {
        tabbedPane.add("Colors", colors);
        tabbedPane.add("Color Display", colorDisplayPanel);
        setLayout(new BorderLayout());
        add(tabbedPane);

        // add a PropertyChangeListener to our Colors isntance.
        colors.addPropertyChangeListener(Colors.NEW_COLOR,
                new PropertyChangeListener() {

                    @Override
                    public void propertyChange(PropertyChangeEvent evt) {
                        Color color = (Color) evt.getNewValue();
                        colorDisplayPanel.setBackground(color);
                    }
                });
    }

    private static void createAndShowGui() {
        JFrame frame = new JFrame("TestColors");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new TestColors());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }
}

@SuppressWarnings("serial")
class Colors extends JPanel implements ChangeListener {
    public static final String NEW_COLOR = "new color";
    private JColorChooser jcc = null;
    protected JLabel title;
    private Color newColor = null;

    public Colors() {
        super(new BorderLayout());

        // Set up the banner at the top of the window
        title = new JLabel("This is my Banner!", SwingConstants.CENTER);

        // Set up color chooser for setting text color
        jcc = new JColorChooser(title.getForeground());
        jcc.getSelectionModel().addChangeListener(this);
        jcc.setBorder(BorderFactory.createTitledBorder("Choose New Color"));

        add(jcc, BorderLayout.CENTER);
        add(title, BorderLayout.PAGE_START);
    }

    public void stateChanged(ChangeEvent e) {
        // Color newColor = jcc.getColor();
        Color oldValue = newColor;
        newColor = jcc.getColor();

        // fire a notification to the Colors JPanel's property change support
        // object. Any listeners will be notified of the color change
        firePropertyChange(NEW_COLOR, oldValue, newColor);
        title.setForeground(newColor);
    }

    public Color getNewCol() {
        System.out.println("this now =" + newColor);
        return newColor;
    }

}
Другие вопросы по тегам