Du bist nicht angemeldet.

Dia3lo

Schüler

  • »Dia3lo« ist der Autor dieses Themas

Beiträge: 77

Registrierungsdatum: 16.08.2011

Wohnort: Braunschweig

Danksagungen: 32

  • Private Nachricht senden

1

11.09.2012, 20:08

[Java] Einfacher Color Chooser

Hey, ich hab mir neulich nen einfachen „Color Chooser“ zusammen gebastelt, der sich leicht überall einbinden lässt. Da man das sowas immer mal wieder braucht, stelle ich den Code gerne zur Verfügung. (Braucht Java 7)

Version: 1.0



Main.java

Spoiler Spoiler


Java-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.awt.Color;
import javax.swing.UIManager;

public class Main
{
	public static void main(String[] args)
	{
		try
		{
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		}
		catch (Exception e)
		{
			System.out.println("Look and Feel wurde nicht gefunden !");
		}
		
		// Startfarbe für ColorChooser festlegen
		HtmlColorChooser cc = new HtmlColorChooser("#72b043");

		if (cc.getOption() == 1)
		{
			Color color = cc.getCc().getColor();
			System.out.println("Auswahl: " + cc.formatColor(color));
		}
		else
		{
			System.out.println("Auswahl abgebrochen");
		}
	}
}


HtmlColorChooser.java

Spoiler Spoiler


Java-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.Array;
import java.lang.reflect.Field;

import javax.swing.*;
import javax.swing.colorchooser.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.border.*;

public class HtmlColorChooser extends JDialog
{
	public static final String HTML_COLOR = "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$";

	private JPanel panel;
	private JPanel panel2;
	private JColorChooser cc;
	private AbstractColorChooserPanel[] panels;

	private JPanel panelSouth;

	private JPanel panelPreview;
	private JPanel panelColorPreview;
	private JTextField fieldColorPreview;

	private JPanel panelButtons;
	private JButton buttonOK, buttonCancel;

	private String startColor;
	private int option = 0;

	public HtmlColorChooser(String startColor)
	{
		this.startColor = startColor;

		setTitle("Farbe ändern");
		setModal(true);
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		setSize(630, 310);
		setLocationRelativeTo(null);

		try
		{
			createWidgets();
			removeAplhaSlider(cc);
			addListener();
			addWidgets();
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}

		if (startColor.matches(HTML_COLOR))
		{
			cc.setColor(Integer.parseInt(startColor.substring(1), 16));
			fieldColorPreview.setText(startColor);
		}
		else
		{
			cc.setColor(Integer.parseInt("ffffff", 16));
			fieldColorPreview.setText("#ffffff");
		}

		setResizable(false);
		setVisible(true);
	}

	private void createWidgets()
	{
		cc = new JColorChooser();

		panels = cc.getChooserPanels();
		panel = new JPanel();
		panel.add(panels[1]);

		panel2 = new JPanel(new BorderLayout());
		panel2.add(panel, BorderLayout.CENTER);

		panelSouth = new JPanel();
		panelSouth.setLayout(new BorderLayout());

		panelPreview = new JPanel();
		panelPreview.setLayout(new BorderLayout(10, 10));
		panelPreview.setBorder(new EmptyBorder(0, 10, 0, 0));

		panelColorPreview = new JPanel();
		panelColorPreview.setBorder(new LineBorder(Color.GRAY, 1));
		panelColorPreview.setPreferredSize(new Dimension(25, 25));

		fieldColorPreview = new JTextField(10);
		fieldColorPreview.setEditable(false);

		panelButtons = new JPanel();
		panelButtons.setLayout(new BorderLayout(5, 0));

		buttonOK = new JButton();
		buttonOK.setText("OK");

		buttonCancel = new JButton();
		buttonCancel.setText("Abbrechen");
	}

	private void addListener()
	{
		cc.getSelectionModel().addChangeListener(new ChangeListener()
		{
			@Override
			public void stateChanged(ChangeEvent arg0)
			{
				panelColorPreview.setBackground(cc.getColor());
				fieldColorPreview.setText(formatColor(cc.getColor()));
			}
		});

		buttonOK.addActionListener(new ActionListener()
		{
			@Override
			public void actionPerformed(ActionEvent arg0)
			{
				option = 1;
				dispose();
			}
		});

		buttonCancel.addActionListener(new ActionListener()
		{
			@Override
			public void actionPerformed(ActionEvent arg0)
			{
				option = 0;
				dispose();
			}
		});
	}

	private void addWidgets()
	{
		Container cp = getContentPane();
		cp.setLayout(new BorderLayout(5, 5));

		((JComponent) cp).setBorder(new EmptyBorder(10, 25, 20, 25));

		panelButtons.add(buttonOK, BorderLayout.WEST);
		panelButtons.add(buttonCancel, BorderLayout.EAST);

		panelPreview.add(panelColorPreview, BorderLayout.CENTER);
		panelPreview.add(fieldColorPreview, BorderLayout.EAST);

		panelSouth.add(panelPreview, BorderLayout.WEST);
		panelSouth.add(panelButtons, BorderLayout.EAST);

		cp.add(panel2, BorderLayout.CENTER);
		cp.add(panelSouth, BorderLayout.SOUTH);
	}

	private void removeAplhaSlider(JColorChooser cc) throws Exception
	{
		AbstractColorChooserPanel[] colorPanels = cc.getChooserPanels();
		for (int i = 1; i < colorPanels.length; i++)
		{
			AbstractColorChooserPanel cp = colorPanels[i];

			Field f = cp.getClass().getDeclaredField("panel");
			f.setAccessible(true);

			Object colorPanel = f.get(cp);
			Field f2 = colorPanel.getClass().getDeclaredField("spinners");
			f2.setAccessible(true);
			Object spinners = f2.get(colorPanel);

			Object transpSlispinner = Array.get(spinners, 3);
			if (i == colorPanels.length - 1)
			{
				transpSlispinner = Array.get(spinners, 4);
			}

			Field f3 = transpSlispinner.getClass().getDeclaredField("label");
			f3.setAccessible(true);
			JLabel label = (JLabel) f3.get(transpSlispinner);
			label.setVisible(false);

			Field f4 = transpSlispinner.getClass().getDeclaredField("slider");
			f4.setAccessible(true);
			JSlider slider = (JSlider) f4.get(transpSlispinner);
			slider.setVisible(false);

			Field f5 = transpSlispinner.getClass().getDeclaredField("spinner");
			f5.setAccessible(true);
			JSpinner spinner = (JSpinner) f5.get(transpSlispinner);
			spinner.setVisible(false);
		}
	}

	public String formatColor(Color c)
	{
		String r = (c.getRed() < 16) ? "0" + Integer.toHexString(c.getRed())
				: Integer.toHexString(c.getRed());
		String g = (c.getGreen() < 16) ? "0"
				+ Integer.toHexString(c.getGreen()) : Integer.toHexString(c
				.getGreen());
		String b = (c.getBlue() < 16) ? "0" + Integer.toHexString(c.getBlue())
				: Integer.toHexString(c.getBlue());

		return "#" + r + g + b;
	}

	public int getOption()
	{
		return option;
	}

	public void setOption(int option)
	{
		this.option = option;
	}

	public JColorChooser getCc()
	{
		return cc;
	}

	public void setCc(JColorChooser cc)
	{
		this.cc = cc;
	}
}

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Dia3lo« (01.05.2014, 00:27)


Es haben sich bereits 4 registrierte Benutzer bedankt.

Benutzer, die sich für diesen Beitrag bedankt haben:

cedi (11.09.2012), Erik (12.09.2012), liro (12.09.2012), Patrick (01.05.2014)

cedi

Profi

Beiträge: 702

Danksagungen: 78

  • Private Nachricht senden

2

11.09.2012, 23:17

nett :D

soetwas hätte ich heute mal auf der Arbeit gebrauchen können... Kein Programm auf dem Rechner installiert, der so einen color-chooser dialog hatte...

Als kleinen Tipp, ich fände noch ein Feld cool, in dem der RGB Wert ausgegeben wird.

(Ich hab mir das Programm ehrlichgesagt auch noch nicht genauer angeschaut, nur den Screenshot, aber ich fände noch 3 dieser Schieberegler cool, um den RGB Wert zu bearbeiten (und dann entsprechend 3 Boxen dahinter um den Wert anzugeben) dann bräuchte man auch kein Extra Feld mehr um den RGB Wert auszugeben, dann könnte man ihn direkt ablesen. Und genug Platz unter den 3 Reglern für Farbton, Sättigung und Wert ist auch noch allemal für RGB Regler)


Aber sonst echt cool!

Dia3lo

Schüler

  • »Dia3lo« ist der Autor dieses Themas

Beiträge: 77

Registrierungsdatum: 16.08.2011

Wohnort: Braunschweig

Danksagungen: 32

  • Private Nachricht senden

3

01.05.2014, 00:21

Update: 1.1 :)
- Direkte Eingabe im Textfeld möglich



Main.java

Spoiler Spoiler


Java-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.awt.Color;
import javax.swing.UIManager;

public class Main
{
	public static void main(String[] args)
	{
		try
		{
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		}
		catch (Exception e)
		{
			System.out.println("Look and Feel wurde nicht gefunden !");
		}
		
		// Startfarbe für ColorChooser festlegen
		HtmlColorChooser cc = new HtmlColorChooser("#72b043");

		if (cc.getOption() == 1)
		{
			Color color = cc.getCc().getColor();
			System.out.println("Auswahl: " + cc.formatColor(color));
		}
		else
		{
			System.out.println("Auswahl abgebrochen");
		}
	}
}


HtmlColorChooser.java

Spoiler Spoiler


Java-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
/**
 * @author Gunter 
 * @version 1.1
 * Beschreibung: Dialog für Farbauswahl
 */

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.lang.reflect.Array;
import java.lang.reflect.Field;

import javax.swing.*;
import javax.swing.colorchooser.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
import javax.swing.border.*;

public class HtmlColorChooser extends JDialog
{
	public static final String HTML_COLOR = "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$";

	private JPanel panel;
	private JPanel panel2;
	private JColorChooser cc;
	private AbstractColorChooserPanel[] panels;

	private JPanel panelSouth;

	private JPanel panelPreview;
	private JPanel panelColorPreview;
	private JTextField fieldColorPreview;

	private JPanel panelButtons;
	private JButton buttonOK, buttonCancel;

	private String startColor;
	private int option = 0;

	public HtmlColorChooser(String startColor)
	{
		this.startColor = startColor;

		setTitle("Farbe auswählen");
		setModal(true);
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		setSize(630, 310);
		setLocationRelativeTo(null);

		try
		{
			createWidgets();
			removeAplhaSlider(cc);
			addListener();
			addWidgets();
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}

		if (startColor.matches(HTML_COLOR))
		{
			cc.setColor(Integer.parseInt(startColor.substring(1), 16));
			fieldColorPreview.setText(startColor);
		}
		else
		{
			cc.setColor(Integer.parseInt("ffffff", 16));
			fieldColorPreview.setText("#ffffff");
		}

		setResizable(false);
		setVisible(true);
	}

	private void createWidgets()
	{
		cc = new JColorChooser();

		panels = cc.getChooserPanels();
		panel = new JPanel();
		panel.add(panels[1]);

		panel2 = new JPanel(new BorderLayout());
		panel2.add(panel, BorderLayout.CENTER);

		panelSouth = new JPanel();
		panelSouth.setLayout(new BorderLayout());

		panelPreview = new JPanel();
		panelPreview.setLayout(new BorderLayout(10, 10));
		panelPreview.setBorder(new EmptyBorder(0, 10, 0, 0));

		panelColorPreview = new JPanel();
		panelColorPreview.setBorder(new LineBorder(Color.GRAY, 1));
		panelColorPreview.setPreferredSize(new Dimension(25, 25));

		fieldColorPreview = new JTextField(10);
		fieldColorPreview.setDocument(new JTextFieldLimit(7));

		panelButtons = new JPanel();
		panelButtons.setLayout(new BorderLayout(5, 0));

		buttonOK = new JButton();
		buttonOK.setText("OK");

		buttonCancel = new JButton();
		buttonCancel.setText("Abbrechen");
	}

	private void addListener()
	{
		cc.getSelectionModel().addChangeListener(new ChangeListener()
		{
			@Override
			public void stateChanged(ChangeEvent arg0)
			{
				panelColorPreview.setBackground(cc.getColor());
				fieldColorPreview.setText(formatColor(cc.getColor()));
			}
		});

		buttonOK.addActionListener(new ActionListener()
		{
			@Override
			public void actionPerformed(ActionEvent arg0)
			{
				option = 1;
				dispose();
			}
		});

		buttonCancel.addActionListener(new ActionListener()
		{
			@Override
			public void actionPerformed(ActionEvent arg0)
			{
				option = 0;
				dispose();
			}
		});

		fieldColorPreview.addKeyListener(new KeyAdapter()
		{
			@Override
			public void keyReleased(KeyEvent arg0)
			{
				if (fieldColorPreview.getText().matches(HTML_COLOR)
						&& fieldColorPreview.getText().length() == 7)
				{
					int caret = fieldColorPreview.getCaret().getDot();
					fieldColorPreview.setForeground(Color.BLACK);
					cc.setColor(Integer.parseInt(fieldColorPreview.getText()
							.substring(1), 16));
					fieldColorPreview.setCaretPosition(caret);
				}
				else
				{
					fieldColorPreview.setForeground(Color.RED);
				}
			}
		});

		fieldColorPreview.getDocument().addDocumentListener(
				new DocumentListener()
				{
					@Override
					public void insertUpdate(DocumentEvent arg0)
					{
						if (fieldColorPreview.getText().matches(HTML_COLOR)
								&& fieldColorPreview.getText().length() == 7)
						{
							fieldColorPreview.setForeground(Color.BLACK);
						}
						else
						{
							fieldColorPreview.setForeground(Color.RED);
						}
					}

					@Override
					public void removeUpdate(DocumentEvent arg0)
					{
					}

					@Override
					public void changedUpdate(DocumentEvent arg0)
					{

					}
				});
	}

	private void addWidgets()
	{
		Container cp = getContentPane();
		cp.setLayout(new BorderLayout(5, 5));

		((JComponent) cp).setBorder(new EmptyBorder(10, 25, 20, 25));

		panelButtons.add(buttonOK, BorderLayout.WEST);
		panelButtons.add(buttonCancel, BorderLayout.EAST);

		panelPreview.add(panelColorPreview, BorderLayout.CENTER);
		panelPreview.add(fieldColorPreview, BorderLayout.EAST);

		panelSouth.add(panelPreview, BorderLayout.WEST);
		panelSouth.add(panelButtons, BorderLayout.EAST);

		cp.add(panel2, BorderLayout.CENTER);
		cp.add(panelSouth, BorderLayout.SOUTH);
	}

	private void removeAplhaSlider(JColorChooser cc) throws Exception
	{
		AbstractColorChooserPanel[] colorPanels = cc.getChooserPanels();
		for (int i = 1; i < colorPanels.length; i++)
		{
			AbstractColorChooserPanel cp = colorPanels[i];

			Field f = cp.getClass().getDeclaredField("panel");
			f.setAccessible(true);

			Object colorPanel = f.get(cp);
			Field f2 = colorPanel.getClass().getDeclaredField("spinners");
			f2.setAccessible(true);
			Object spinners = f2.get(colorPanel);

			Object transpSlispinner = Array.get(spinners, 3);
			if (i == colorPanels.length - 1)
			{
				transpSlispinner = Array.get(spinners, 4);
			}

			Field f3 = transpSlispinner.getClass().getDeclaredField("label");
			f3.setAccessible(true);
			JLabel label = (JLabel) f3.get(transpSlispinner);
			label.setVisible(false);

			Field f4 = transpSlispinner.getClass().getDeclaredField("slider");
			f4.setAccessible(true);
			JSlider slider = (JSlider) f4.get(transpSlispinner);
			slider.setVisible(false);

			Field f5 = transpSlispinner.getClass().getDeclaredField("spinner");
			f5.setAccessible(true);
			JSpinner spinner = (JSpinner) f5.get(transpSlispinner);
			spinner.setVisible(false);
		}
	}

	public String formatColor(Color c)
	{
		String r = (c.getRed() < 16) ? "0" + Integer.toHexString(c.getRed())
				: Integer.toHexString(c.getRed());
		String g = (c.getGreen() < 16) ? "0"
				+ Integer.toHexString(c.getGreen()) : Integer.toHexString(c
				.getGreen());
		String b = (c.getBlue() < 16) ? "0" + Integer.toHexString(c.getBlue())
				: Integer.toHexString(c.getBlue());

		return "#" + r + g + b;
	}

	public int getOption()
	{
		return option;
	}

	public void setOption(int option)
	{
		this.option = option;
	}

	public JColorChooser getCc()
	{
		return cc;
	}

	public void setCc(JColorChooser cc)
	{
		this.cc = cc;
	}
}

class JTextFieldLimit extends PlainDocument
{
	private int limit;

	JTextFieldLimit(int limit)
	{
		super();
		this.limit = limit;
	}

	JTextFieldLimit(int limit, boolean upper)
	{
		super();
		this.limit = limit;
	}

	public void insertString(int offset, String str, AttributeSet attr)
			throws BadLocationException
	{
		if (str == null)
			return;

		if ((getLength() + str.length()) <= limit)
		{
			super.insertString(offset, str, attr);
		}
	}
}

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Dia3lo« (01.05.2014, 12:51)


Patrick

Profi

Beiträge: 694

Danksagungen: 168

  • Private Nachricht senden

4

01.05.2014, 20:28

Und dadrunter jetzt noch RGB :D
Ex ungue leonem.

War der Beitrag für dich hilfreich?
Dann drück auf .

Es hat sich bereits 1 registrierter Benutzer bedankt.

Benutzer, die sich für diesen Beitrag bedankt haben:

Erik (02.05.2014)

Erik

Profi

Beiträge: 1 274

Registrierungsdatum: 22.06.2011

Wohnort: Deutschland ;)

Danksagungen: 307

  • Private Nachricht senden

5

02.05.2014, 11:56

Wär auch dafür :D
Beste Webite im Internet ( ͡° ͜ʖ ͡°)
xinra.de

Ähnliche Themen