1

私はpython/QtGUIアプリケーションをJava/Swingに変換しているところです。元のアプリケーションは、ユーザーがQColorDialogのスライダーをドラッグすると、シーンの色を継続的に美しく更新します。JColorChooserで同様の効果を得るにはどうすればよいですか?私が見つけたすべての例は、ユーザーが[適用]または[OK]ボタンをクリックしたときにのみ色を更新します。ユーザーが「赤」スライダーなどをドラッグしたときに、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

@Guillaumeのアプローチjava.awt.image.RescaleOp使用すると、画像の色を動的に変更できます。例はここここ、ここにあります

画像

于 2013-02-24T15:13:56.670 に答える
4

を の にアタッチできるように、JColorChooserとの独自のインスタンスを作成する必要があります。JDialogChangeListenerColorSelectionModelJColorChooser

このような操作を実行する方法を示す小さなデモ コードを次に示します。

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 に答える