JToggleButton ändert Aussehen nicht nach setEnabled(false)

mas666

Mitglied
Hallo,

Der Titel sagt eigentlich schon alles. btn.setEnabled(false); hat keinen Einfluss auf das Aussehen des Buttons (auf dem angehängten Bild ist der Button disabled und sollte eigentlich grau sein).
Wenn ich den Buttontext ändere (entfernen von '<html>') dann funktioniert es. Ich benötige allerdings einen mehrzeiligen Text (siehe Bild).

Gibt es eine Möglichkeit, das ganze 'richtig' zu lösen? Muss ich echt die Foreground color setzen, respektive einen Renderer schreiben?

Java:
public class ButtonTest extends JFrame {

	public ButtonTest() {
		super("Button test");
		
		try {
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
			JFrame.setDefaultLookAndFeelDecorated(true);
		} 
		catch (final ClassNotFoundException e1) {} 
		catch (final InstantiationException e1) {}
		catch (final IllegalAccessException e1) {} 
		catch (final UnsupportedLookAndFeelException e1) {}
		
		GridBagLayout layout = new GridBagLayout();
		GridBagConstraints c = new GridBagConstraints();
		setLayout(layout);
		
		c.gridx = 0;
		c.gridy = 0;
		JToggleButton btn = new JToggleButton("<html>Button 1");
		btn.setEnabled(false);
		layout.setConstraints(btn, c);
		add(btn);
		pack();
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ButtonTest test = new ButtonTest();
		test.setVisible(true);
	}

}

Danke für eure Hilfe

Gruss
mas
 

Anhänge

  • buttontest.PNG
    buttontest.PNG
    2,6 KB · Aufrufe: 222
Moin,

wodurch erzeugst Du denn die Einträge "Zeile 2" und "Zeile 3" :confused:

Hast Du mal versucht, das HMTL-Tag auch wieder zu schließen ?

Gruß
Klaus
 
Sorry, habe das Beispiel zusammenkopiert, da der Originalcode viel Umfangreicher ist. Das Bild entstand mit dieser Codezeile. Schliessen des Tags bringt nichts. Auch die korrekte Verwendung von <br/> ändert nichts und bricht nicht einmal die Zeile um.

Java:
JToggleButton btn = new JToggleButton("<html>Button 1<br>2. Zeile<br>3. Zeile</html>");

Gruss
mas
 
Moin,

ein Element "<br/>" gibt es IMHO bei HMTL auch nicht ...
Du kannst allerdings in XHTML mit "<br />" ein leeres Element bezeichnen - wichtig ist dann dabei das Leerzeichen nach br !

Dann würde mich ggf. noch folgende Variante einfallen, wenn es denn ohne HTML-Tags funktioniert:
Code:
new JToggleButton("Button 1\n2. Zeile\n3. Zeile");

Gruß
Klaus
 
Asche auf mein Haupt. Mit der Verwendung von <br> respektive <br /> hast Du natürlich Recht.

Trotzdem: Ich habe natürlich schon einiges ausprobert bevor ich mich hier melde. Dein Beispiel:

Java:
try {
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
			JFrame.setDefaultLookAndFeelDecorated(true);
		} 
		catch (final ClassNotFoundException e1) {} 
		catch (final InstantiationException e1) {}
		catch (final IllegalAccessException e1) {} 
		catch (final UnsupportedLookAndFeelException e1) {}
		
		JToggleButton btn = new JToggleButton("Button 1\n2. Zeile\n3. Zeile");
		btn.setEnabled(false);
		add(btn);
		pack();

hat zwar den gewünschten Effekt was das ausgrauen anbelangt, es ist aber IMHO nicht möglich mit \n mehrzeilige Texte in JButtons anzuzeigen.

Gruss
mas
 

Anhänge

  • buttontest.PNG
    buttontest.PNG
    2,9 KB · Aufrufe: 219
Moin,

hat zwar den gewünschten Effekt was das ausgrauen anbelangt, es ist aber IMHO nicht möglich mit \n mehrzeilige Texte in JButtons anzuzeigen.

Und Asche auf MEIN Haupt ... hast Recht, habe gerade mal kurz mit meinem eigenen Testprogramm rumgetestet und dabei Deinen Eintrag so übernommen ...
Java:
JToggleButton btn = new JToggleButton("<HTML>Button 1<br>2. Zeile<br>3. Zeile");
add(btn);
btn.setEnabled( false );

Dabei fiel mir folgendes auf:
ist btn wirklich disabled, dann kann er auch nicht angeklickt werden ... allerdings wird die Schrift nicht aus gegraut!
ist btn enabled und ich klicke ihnan, dann ändert sich - je nach Zustand - 'nur' die Hintergrundfarbe, was aber, wenn ich die API richtig verstehe, auch das korrekte Verhalten ist!

Wenn Dir also wirklich nur um die Schriftart geht, dann wirst Du sie jedesmal selbst händisch umsetzen müssen !

Gruß
Klaus
 
Mir is grad nix blöderes eingefallen^^:
Java:
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JToggleButton;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Buttontest extends JFrame {     
	
	public Buttontest() {    
		
		super("Button test");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		try {            
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
			JFrame.setDefaultLookAndFeelDecorated(true);        }         
		catch (final ClassNotFoundException e1) {}         
		catch (final InstantiationException e1) {}        
		catch (final IllegalAccessException e1) {}        
		catch (final UnsupportedLookAndFeelException e1) {}                
		GridBagLayout layout = new GridBagLayout();        
		GridBagConstraints c = new GridBagConstraints();        
		setLayout(layout);                
		c.gridx = 0;        
		c.gridy = 0;        
		JToggleButton btn = new JToggleButton(); 
		btn.setLayout( new GridLayout(3, 1, 6, 3) );
		JLabel jl_test[] = new JLabel[3];
		jl_test[0] = new JLabel("Button 1");
		jl_test[1] = new JLabel("Zeile 1");
		jl_test[2] = new JLabel("Zeile 2");
		
		for (int i = 0; i < jl_test.length; i++) {
			jl_test[i].setEnabled(false);
			btn.add(jl_test[i]);
		}

		btn.setEnabled(false);
		layout.setConstraints(btn, c);        
		add(btn);        
		pack();   
		}       
	/**     * @param args     */    
	public static void main(String[] args) {       
		Buttontest test = new Buttontest();        
		test.setVisible(true);    
		} 
	}
 

Anhänge

  • button_en.bmp
    31 KB · Aufrufe: 23
Da wär ich jetzt nicht drauf gekommen... Danke!

Trotzdem ist der beschriebene Effekt wohl eher ein Bug als ein Feature... und die Lösung zwar OK aber nicht besonders schön, vor allem wenn man anpassbare Fenster hat und die Grösse des Buttons sich verändern kann. Ich werd wohl noch ein wenig mit den Layouts herumproberen, damit das visuell stimmt.

Einstweilen bin ich aber glücklich überhaupt eine Lösung zu haben.

Gruss
mas
 
Zuletzt bearbeitet:
hmm, ist zumindest ein Ansatz :p

Wird so nur nicht funktionieren, wenn man den Buttonzustand per Mausklick ändert, oder ?
Vlt. ist es eine Idee, die for-Schleife in einen entsprechenden Listener (oder war hier ein Observer :rolleyes:) zu packen ...

Gruß
Klaus
 
Ja klar nur ein ansatz aber so kann man des ja dann verwenden:
Java:
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JToggleButton;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Buttontest extends JFrame {     

	public Buttontest() {    
		
		super("Button test");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		try {            
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
			JFrame.setDefaultLookAndFeelDecorated(true);        }         
		catch (final ClassNotFoundException e1) {}         
		catch (final InstantiationException e1) {}        
		catch (final IllegalAccessException e1) {}        
		catch (final UnsupportedLookAndFeelException e1) {}                
		GridBagLayout layout = new GridBagLayout();        
		GridBagConstraints c = new GridBagConstraints();        
		setLayout(layout);                
		c.gridx = 0;        
		c.gridy = 0;        
		final JToggleButton btn = new JToggleButton();
		final JLabel jl_test[] = new JLabel[3]; 
		btn.setLayout( new GridLayout(3, 1, 6, 3) );
		
		jl_test[0] = new JLabel("Button 1");
		jl_test[1] = new JLabel("Zeile 1");
		jl_test[2] = new JLabel("Zeile 2");
		JButton jb_enable = new JButton("enable");
		ActionListener al_Enable = new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				setEnable(btn,jl_test);
			}
		};
		jb_enable.addActionListener(al_Enable);
		for (int i = 0; i < jl_test.length; i++) 
		{
			for (int j = 0; j < jl_test.length; j++) {
				btn.add(jl_test[i]);
			}
		}
		
		layout.setConstraints(btn, c);        
		add(btn); 
		add(jb_enable); 
		pack();   
		}  
	public void setEnable(JToggleButton btn, JLabel[] jl_test){
		if(btn.isEnabled())
		{
			for (int i = 0; i < jl_test.length; i++) 
			{
				jl_test[i].setEnabled(false);
			}
			btn.setEnabled(false);
		}
		else
		{			
			for (int i = 0; i < jl_test.length; i++) 
			{
				jl_test[i].setEnabled(true);
			}
			btn.setEnabled(true);
		}
	}
	/**     * @param args     */    
	public static void main(String[] args) {       
		Buttontest test = new Buttontest();        
		test.setVisible(true);    
		} 
	}
 

Neue Beiträge

Zurück