Как переопределить кнопку сброса JColorChooser? - PullRequest
0 голосов
/ 29 мая 2020

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

Этот новый вопрос относится к кнопке Reset. В соответствии с документацией, кнопка «Сброс» сбрасывает цвета обратно к исходному цвету, который был передан. Это отлично работает, но что, если есть дополнительное поле?

Вот код ...

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class ColorChooserSample implements Runnable{

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

    private JPanel panel;
    JTextField counter;
    int vCounter = 1;

    @Override
    public void run() {
        JFrame frame = new JFrame(
                "JColorChooser Sample");
        frame.setDefaultCloseOperation(
                JFrame.EXIT_ON_CLOSE);

        panel = new JPanel();
        panel.setPreferredSize(new Dimension(300, 200));
        JButton button = new JButton(
                "Pick to Change JPanel Background");
        button.addActionListener(new ColorListener());
        panel.add(button);

        frame.add(panel, BorderLayout.CENTER);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public void setJPanelBackground(Color color) {
        panel.setBackground(color);
        panel.repaint();
    }

    public class ColorListener implements 
            ActionListener, ChangeListener {

        private JColorChooser chooser;

        private JPanel previewPanel;

        @Override
        public void actionPerformed(
                ActionEvent actionEvent) {
            Color backgroundColor = showDialog(panel, 
                    "Set JPanel Background", 
                    panel.getBackground());
            setJPanelBackground(backgroundColor);
        }

        private Color showDialog(Component component, 
                String title, Color initialColor) 
                        throws HeadlessException {
            chooser = new JColorChooser(initialColor);
            chooser.getSelectionModel()
                .addChangeListener(this);

            // configuring color chooser panel
            previewPanel = new JPanel();
            previewPanel.setBackground(initialColor);
            JLabel label = new JLabel("Hello World!");
            counter = new JTextField("0");
            previewPanel.add(label, BorderLayout.WEST);
            previewPanel.add(counter, BorderLayout.EAST);
            chooser.setPreviewPanel(previewPanel);

            // creating dialog
            ColorTracker ok = new ColorTracker(chooser);
            JDialog dialog = JColorChooser.createDialog(
                    component, title, true, chooser, 
                    ok, null);
            dialog.setVisible(true);
            return ok.getColor();
        }

        @Override
        public void stateChanged(ChangeEvent event) {
            Color newColor = chooser.getColor();
            previewPanel.setBackground(newColor);
            counter.setText(Integer.toString(vCounter++));
        }
    }

    private class ColorTracker implements ActionListener {

        private Color color;

        private JColorChooser chooser;

        public ColorTracker(JColorChooser chooser) {
            this.chooser = chooser;
        }

        @Override
        public void actionPerformed(ActionEvent event) {
            color = chooser.getColor();
        }

        public Color getColor() {
            return color;
        }

    }

}

Приведенный выше код сначала откроет это диалоговое окно.

enter image description here

После нажатия кнопки «Выбрать для изменения фона JPanelBackground» он открывает JColorDialog с измененным разделом предварительного просмотра. Этот раздел включает «Hello World», который изменит цвета фона, и счетчик, чтобы подсчитать, сколько раз менялся цвет.

enter image description here

Ниже показан последний выбранный цвет, но также отображается 5 в текстовом поле, что означает, что было выбрано 5 вариантов цвета.

enter image description here

Нажмите кнопку сброса, и цвет фона будет установлен на исходный, но счетчик НЕ был сброшен обратно на 0.

enter image description here

Вы можете передать Listener как для кнопки OK, так и для кнопки Cancel, но не для кнопки Reset.

Это только пример, поскольку быть другими элементами в разделе предварительного просмотра. Задача состоит в том, как можно сбросить значения, отличные от цвета?

1 Ответ

1 голос
/ 29 мая 2020

Единственное, что делает кнопка reset, это вызов chooserPane.setColor(initialColor). Итак, если вам действительно нужно прислушиваться к изменениям цвета, вы можете сделать это примерно так:

        chooser.getSelectionModel().addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                Color newColor = chooser.getColor();
                previewPanel.setBackground(newColor);
                counter.setText(Integer.toString(vCounter++));
            }
        });

И ваша вторичная панель будет обновлена.

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

EDIT Хорошо, это должна быть кнопка сброса. Поскольку это локальная переменная некоторого метода создания контента, ее необходимо удалить хирургическим путем. Просто замените new JButton("abc") на свою собственную кнопку со своим собственным слушателем (ами).

        Locale locale = dialog.getLocale();
        String resetString = UIManager.getString("ColorChooser.resetText", locale);

        Container contentPane = dialog.getContentPane();
        JPanel buttonPanel = null;
        for (Component c : contentPane.getComponents()) {
            if (c instanceof JPanel) {
                buttonPanel = (JPanel) c;
            }
        }

        JButton resetButton = null;
        if (buttonPanel != null) {
            for (Component b : buttonPanel.getComponents()) {
                if (b instanceof JButton) {
                    JButton button = (JButton) b;
                    if (resetString.equals(button.getText())) {
                        resetButton = button;
                        break;
                    }
                }
            }
            if (resetButton != null) {
                buttonPanel.remove(resetButton);
                buttonPanel.add(new JButton("abc"));
            }
        }
...