В предыдущем посте я обсуждал переопределение панели предварительного просмотра, и все работает хорошо, за исключением того, что возник новый вопрос, и я надеюсь, что исправить это так же просто.
Этот новый вопрос относится к кнопке 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;
}
}
}
Приведенный выше код сначала откроет это диалоговое окно.
После нажатия кнопки «Выбрать для изменения фона JPanelBackground» он открывает JColorDialog с измененным разделом предварительного просмотра. Этот раздел включает «Hello World», который изменит цвета фона, и счетчик, чтобы подсчитать, сколько раз менялся цвет.
Ниже показан последний выбранный цвет, но также отображается 5 в текстовом поле, что означает, что было выбрано 5 вариантов цвета.
Нажмите кнопку сброса, и цвет фона будет установлен на исходный, но счетчик НЕ был сброшен обратно на 0.
Вы можете передать Listener как для кнопки OK, так и для кнопки Cancel, но не для кнопки Reset.
Это только пример, поскольку быть другими элементами в разделе предварительного просмотра. Задача состоит в том, как можно сбросить значения, отличные от цвета?