1

我正在将 python/Qt GUI 应用程序翻译成 Java/Swing。当用户在 QColorDialog 中拖动滑块时,原始应用程序会不断地漂亮地更新场景颜色。如何在 JColorChooser 中获得类似的效果?我发现的所有示例仅在用户单击“应用”或“确定”按钮时才会更新颜色。当我的用户拖动“红色”滑块时,是否有一种机制可以监听 JColorChooser 中的连续颜色变化?

// How can I listen to every color adjustment?
// (i.e. not just when the user presses "Apply" or "OK"?)
ActionListener actionListener = new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent arg0) {
        System.out.println("color changed");
    }
};
Dialog colorDialog = JColorChooser.createDialog(ColorChannelWidget.this,
        "Select color for channel 3",
        false, // not modal
        new JColorChooser(Color.pink),
        actionListener, actionListener);
colorDialog.setVisible(true);

编辑:

我将要更改的颜色在动态生成的 OpenGL 场景中。不是,比如说,静态图像。

4

2 回答 2

4

您将需要创建自己的 and 实例,以便JColorChooserJDialog可以将 a 附加ChangeListenerColorSelectionModel.JColorChooser

这是一个小演示代码,展示了如何执行此类操作:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Window;
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.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class TestColorChooser {

    protected void initUI() {
        JFrame frame = new JFrame(TestColorChooser.class.getSimpleName());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final JPanel panel = new JPanel() {
            @Override
            public java.awt.Dimension getPreferredSize() {
                return new Dimension(400, 400);
            };
        };
        final JButton button = new JButton("Click me to change color");
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                Window parentWindow = SwingUtilities.windowForComponent(button);
                final JColorChooser chooser = new JColorChooser(panel.getBackground());
                chooser.getSelectionModel().addChangeListener(new ChangeListener() {

                    @Override
                    public void stateChanged(ChangeEvent e) {
                        panel.setBackground(chooser.getColor());
                    }
                });
                JDialog dialog = new JDialog(parentWindow);
                dialog.add(chooser);
                dialog.pack();
                dialog.setLocation(panel.getLocationOnScreen().x + panel.getWidth(), panel.getLocationOnScreen().y);
                dialog.setVisible(true);
            }
        });
        frame.add(panel);
        frame.add(button, BorderLayout.SOUTH);
        frame.pack();
        frame.setVisible(true);
    }

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

            @Override
            public void run() {
                new TestColorChooser().initUI();
            }
        });
    }
}
于 2013-02-24T15:07:37.370 回答
4

使用@Guillaume 的方法java.awt.image.RescaleOp可用于动态更改图像的颜色。可以在此处此处此处找到示例。

图片

于 2013-02-24T15:13:56.670 回答