JCheckBox als JLabel

  • Themenstarter Themenstarter Bash
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
B

Bash

Gast
Hi zusammen,

ich will ein reines Anzeige-Panel basteln, in dem JLabels, JTextAreas usw nicht editierbar angezeigt werden.
Unter anderem sollen boolsche Werte als JCheckBox dargestellt werden.
Aber wenn ich eine JCheckBox disable, dann wird sie natürlich gegraut angezeigt.
Sieht bescheuert aus.

Hab versucht einen MouseListener dran zu hängen, kann die Events aber nicht mit consume blockieren.
Die Farbe der disableten CheckBox kann man scheinbar nicht einstellen, oder?
Wie kann ich
- die Events in den Müll schicken, oder
- ein JLabel so konfigurieren, dass es wie eine JCheckBox aussieht oder
- sonst wie einen Boolschen Wert nicht editierbar als normale CheckBox darstellen?

Mit JLayeredPane würd´s gehen, aber da handel ich mir mehr (Layout-)Nachteile als Vorteile ein.

Bin der Verzweiflung nahe.
Das muss doch ganz einfach gehen.
Kann´s mir jemand sagen?

Gruß,
Basch
 
lass di events sein und arbeite nicht mit disable sondern mit setSelected();

Code:
JCheckBox cb = new JCheckBox();
cb.setSelected(false);
 
@dotlens: Danke für die Antwort, aber das hilft mir nicht.

Dass ich setSelected machen muss ist klar.

Aber wie kann ich das Ding _sperren_, ohne dass es ausgegraut wird?
 
Mach eine eigene Klasse, und übersteuere den Event:

Code:
import javax.swing.JCheckBox;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class MyCheckBox extends JCheckBox {
	private boolean selected;
	public MyCheckBox(String text, boolean selected) {
		super(text, selected);
		this.selected= selected;
		addChangeListener(new ChangeListener() {
			public void stateChanged(ChangeEvent evt) {
				setState();
			}
		});
	}
	private void setState() {
		super.setSelected(selected);
	}
}
 
dotlens hat gesagt.:
lass di events sein und arbeite nicht mit disable sondern mit setSelected();

Code:
JCheckBox cb = new JCheckBox();
cb.setSelected(false);
Ich glaube das er hat er auch noch selbst hinbekommen. Er meint, wie er verhindern kann, dass man eine Checkbox per Mausclick verändert und trotz die Änderung per Script möglich bleibt.

bash hat gesagt.:

Das klingt doch gar nicht so schlecht. Warum machst du dir nicht eine eigene Checkbox, die von JCheckbox erbt und überschreibtst die Methode configurePropertiesFromAction(Action a).

[edit] Da war ich wohl zu langsam :shock:
 
@meez: Danke für den Vorschlag. Das kommt schon näher an mein Problem ran:
Der Wert der CheckBox ändert sich nicht.

Das ist aber leider immer noch nicht die Lösung, die ich suche.
Den gleichen Effekt hab ich schon mal erreicht, indem ich einen ActionListener an das Objekt dran gehängt hab.

Mich stört, dass die JCheckBox auf Maus und Taste immer noch reagiert. Auch wenn der Wert sich nicht ändert.

Ich bin vielleicht zu schleckig:
Die JCheckBox soll überhaupt nicht reagieren. Als ob sie ein JLabel wäre.
 
Eine Variante ist eine Component zu zeichnen, welche nur wie eine Checkbox aussieht, in wirklichkeit aber keine ist:

Code:
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JFrame;


public class Test5 extends JFrame{
	public static void main( String[] args ){
		Test5 t = new Test5();
		t.add( new CheckboxLabel( "Hallo", true ) );
		t.pack();
		t.setLocationRelativeTo( null );
		t.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		
		t.addWindowListener( new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit( 0 );
			}
		});
		
		t.setVisible( true );
	}
	
	public Test5(){
		
	}
}

class CheckboxLabel extends JComponent{
	private JCheckBox box = new JCheckBox();
	
	public CheckboxLabel(){
		add( box );
		box.setFocusable( false );
		invalidate();
	}
	
	public CheckboxLabel( String text, boolean selected ){
		this();
		setText( text );
		setSelected( selected );
	}
	
	public void setText( String text ){
		box.setText( text );
		repaint();
	}
	
	public void setSelected( boolean selected ){
		box.setSelected( selected );
		repaint();
	}
	
	public Dimension getMinimumSize() {
		return box.getMinimumSize();
	}
	
	public Dimension getMaximumSize() {
		return box.getMaximumSize();
	}
	
	public Dimension getPreferredSize() {
		return box.getPreferredSize();
	}
	
	public void paint( Graphics g ){
		box.paint( g );
	}
	
	public void doLayout() {
		box.setBounds( 0, getHeight(), getWidth(), getHeight() );
	}
}
 
Bash hat gesagt.:
@dotlens: Danke für die Antwort, aber das hilft mir nicht.

Dass ich setSelected machen muss ist klar.

Aber wie kann ich das Ding _sperren_, ohne dass es ausgegraut wird?

sorry bin heut nich so schnell, sorry 😳

also das mit dem glassPane hilft nichts, glassPane reagiert auch auf evente...

würde mir auch selbst eine CheckBox zeichnen wie es schon Beni gezeigt hat...
 
Warum nimmst du denn nicht einfach ein label, und papst da einen Haken als Icon drauf?
Warum überhaupt die Checkbox?
 
@hugo:
hugo hat gesagt.:
Ich glaube das er hat er auch noch selbst hinbekommen.
Danke für das Vertrauen :wink:

hugo hat gesagt.:
Das klingt doch gar nicht so schlecht. Warum machst du dir nicht eine eigene Checkbox, die von JCheckbox erbt und überschreibtst die Methode configurePropertiesFromAction(Action a).
Hört sich gut an. Aber das muss ich mir doch erst mal angucken. Hab ich bisher noch nicht benutzt. Ich komm vielleicht noch mal drauf zurück.

@Andy: Glass pane gibt´s leider nur bei der Root pane, nicht bei JInternalFrame usw., wenn ich das richtig sehe.

@Beni: Super! Das isses.
Bei mir kam zwar ein kleiner Fehler, aber nachdem ich t.add(new ...) durch t.getContentPane().add(new ...) ersetzt hab, war ich glücklich!
Code muss ich mir noch ein bisschen genauer angucken.

Danke!
 
@dotlens: Bin auch nicht der Schnellste und manchmal vergess ich sogar meinen Namen. 😳

@meez:
meez hat gesagt.:
Warum nimmst du denn nicht einfach ein label, und papst da einen Haken als Icon drauf?
Warum überhaupt die Checkbox?
CheckBox, weil man in anderen Panels diese Werte mit einer CheckBox setzt. Konsistenz.
Keine Icons, weil die CheckBox nicht in jeder Java-Version gleich aussehen muss, d.h. Lösung ist mir nicht allgemein genug.

Wie gesagt: Die Lösung von Beni kann genau das, was ich gesucht hab.
Noch mal danke!
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben