JColorchooser und Transparenz

Theophilius

Grünschnabel
Hallo tutorials.de,

habe schon wieder ein neues Problem, welches mich direkt selbst wundert.

Ich habe eine Klasseninstanz eines JColorchoosers, mit 4 Buttons am unteren Ende
(Übernehmen, Vorschau, Abbrechen und Zurücksetzen).

Wähle ich eine normale Farbe aus den Mustern aus passt alles, wenn ich aber eine HSV Farbe nehme, und die Transparenz verändere, angenommen auf 50%, dann auf Vorschau oder OK klicke, dann ändert sich die Farbe nicht gleich.

Klicke ich aber hingegen zweimal auf den Vorschau Button, ändert sich auf einmal die Farbe.
Hier mal der Code, keine Ahnung wo da der Fehler ist.

Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.colorchooser.AbstractColorChooserPanel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class popup_colorchooser extends JColorChooser {

	public JColorChooser cc;
	JFrame holdingFrame;
	
	Color color;
	
	public popup_colorchooser(final Color InitialColor) {
		super();
		
		holdingFrame = new JFrame("Farbe auswählen");
		holdingFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		
		cc = new JColorChooser();
		
		cc.setColor(InitialColor);
		
		JPanel colorPanel = new JPanel();
		JPanel buttonPanel = new JPanel();
		
		// CustomButtons haben nur ein anderes Icon, leiten JButtons ab
		JButton confirmButton = new customButton("OK");	
		JButton viewButton = new customButton("Vorschau");
		JButton cancelButton = new customButton("Abbrechen");
		JButton resetButton = new customButton("Zurücksetzen");


		
		confirmButton.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent arg0) {
				if(cc.getColor()!= null){			
					
					// ändert den Hintergrund des Hauptframes und schliesst colorchooser
					bilder_dias.setBackgroundColor(cc.getColor());
					bilder_dias.image_label.repaint();
					holdingFrame.setVisible(false);
				}
			}			
		});
		
		viewButton.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent arg0){
				
				// ändert den Hintergrund des Hauptframes sofort
				bilder_dias.setBackgroundColor(cc.getColor());
				bilder_dias.image_label.repaint();
			}			
		});
		
		cancelButton.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent arg0) {
				
				// bricht ab und setzt auf ursprüngliche Farbe zurück
				
				cc.setColor(InitialColor);
				
				bilder_dias.setBackgroundColor(InitialColor);
				bilder_dias.image_label.repaint();

				
				holdingFrame.dispose();
			}			
		});
		
		resetButton.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent arg0) {
				
				// setzt auf ursprüngliche Farbe zurück
				
				cc.setColor(InitialColor);
				
				bilder_dias.setBackgroundColor(InitialColor);
				bilder_dias.image_label.repaint();
			}			
		});
		

		// Zwei Panels im BoxLayout untereinander gesetzt
		
		colorPanel.add(cc);
		
		buttonPanel.add(confirmButton);
		buttonPanel.add(viewButton);
		buttonPanel.add(cancelButton);
		buttonPanel.add(resetButton);
		
		
		holdingFrame.setLayout(new BoxLayout(holdingFrame.getContentPane(), BoxLayout.Y_AXIS));
		
		holdingFrame.add(colorPanel);
		holdingFrame.add(buttonPanel);		
		
		holdingFrame.pack();
	}

}
 

Funresort

Erfahrenes Mitglied
Jframe mit setvisible aktualisieren ;) kann den code leiser nicht sehen qegen handy version aber schau ma ob dir ein setvisible fehlt
 
Zuletzt bearbeitet:

Theophilius

Grünschnabel
colorchooser_hsvpanel.PNG

So sieht das derzeit aus, weiß nicht ganz was du meinst mit dem setVisible, beide Frames sind schon sichtbar.

Wärs zum aktualisieren nicht besser mit repaint()?
 

Funresort

Erfahrenes Mitglied
Sieht gut aus :) kann auch jetzt das Coding sehen. Ich bevorzuge setVisible(), hatte mit repaint mal probleme.

Wenns du das noch nen wing schöner aussehen lassen möchtest, dann nimm doch Nimbus :)

Code:
		try {
			UIManager
					.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
		} catch (Exception e) {
		}

Einfach beim Initialisieren das Coding einbauen ;)
 

Theophilius

Grünschnabel
Das eigentlich Problem ist, dass er mir beim rüberfahren mit der Maus, z.b. über die Sliders das Fenster wieder "übermalt", hoffe man kann das oben so erkennen.
Das sieht schon etwas seltsam aus.

Dazu eine Idee oder ist das genau das was du meintest?
 
Zuletzt bearbeitet:

Theophilius

Grünschnabel
Ich weiß jetz wo der Fehler liegt /lag, ist jetzt behoben soweit ich das sehen kann.

Hatte damit zu tun dass ich ihm Code von colorchooser nicht explizit gesagt habe er soll gleich sichtbar sein.

Hab in der Hauptklasse ein Objekt vom colorchooser erstellt, dass dann relativ zum hauptframe gesetzt und dann erst sichtbar gemacht. Wies aussieht war das zuviel code des guten ^^

Hab das mit der Transparenz auch noch hingekriegt. Der wollte zuerst nicht ganz so transparent werden. Hab dann noch den Parent des Objekts repainten lassen udn jetz gehts.

Trotzdem danke für deine Mühen :)
 

Theophilius

Grünschnabel
Bist du dir da sicher? Der Alpha Constructor von Color ist doch schon länger verfügbar oder?

Hab bei eclipse mal code compliance runtergesetzt auf 1.3, alles angepasst damits auch funktioniert, und bei mir meckert er nicht bei nem rgba constructor von color.