首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何覆盖JColorChooser重置按钮?

如何覆盖JColorChooser重置按钮?
EN

Stack Overflow用户
提问于 2020-05-29 18:43:39
回答 1查看 336关注 0票数 0

在前一篇文章中,我讨论了覆盖预览面板,一切都很好,除了一个新的问题已经出现,并希望修复它是一样容易。

这个新问题与重置按钮有关。根据文档,重置按钮将颜色重新设置为传入的原始颜色。这很好,但是如果有第二个字段呢?

这是密码..。

代码语言:javascript
复制
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;
        }

    }

}

上面的代码将首先打开这个对话框。

单击"Pick to Change JPanelBackground“按钮后,将打开带有修改后的预览部分的JColorDialog。本节包括"Hello“,它将更改背景色,并有一个计数器来计算颜色更改的次数。

下面显示了最后选择的颜色,但也显示了文本框中的5,以表示单击了5个颜色选项。

单击“重置”按钮,颜色背景设置为原始颜色,但计数未重置为0。

您可以为“确定”和“取消”按钮传入侦听器,但不能传递“重置”按钮。

这只是一个例子,因为预览部分中可能有其他项目。目标是如何重置颜色以外的值?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-29 19:09:06

reset按钮所做的唯一的事情就是调用chooserPane.setColor(initialColor)。所以,如果你真正需要的是倾听颜色的变化,你可以这样做,比如:

代码语言:javascript
复制
        chooser.getSelectionModel().addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                Color newColor = chooser.getColor();
                previewPanel.setBackground(newColor);
                counter.setText(Integer.toString(vCounter++));
            }
        });

你的辅助面板就会更新。

话虽如此,如果您确实想要向按钮中添加一个侦听器,则没有公开的访问它的方法--您需要一直遍历组件,直到找到该按钮,然后向它添加一个侦听器。

编辑 be,所以它必须是重置按钮。因为这是一些内容创建方法的局部变量,所以必须通过手术将其删除。只需使用您自己的侦听器将new JButton("abc")更改为您自己的按钮即可。

代码语言:javascript
复制
        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"));
            }
        }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62092716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档