RadioButton change (active) icon?

membersound

Bekanntes Mitglied
Hallo,

bei eine JRadioButton kann ich das Icon ja mit setIcon setzen.

Aber wie kann ich dann isSelected() kontrollieren? Also sinnvoll wäre sowas ja nur, wenn sich das Icon bei Selection ändern kann. Wie erreiche ich das? Oder muss ich dafür das Look&Feel überschreiben?

Danke
 

njans

Top Contributor
Einen ActionListener oder changeListener anhängen. Dann kannst du auf Veränderungen reagieren, je nachdem, was du genau willst. Das Icon kannst du jeder Zeit, mit der entsprechenden Methode setzen.
 

membersound

Bekanntes Mitglied
Ach ChangeListener, gute Idee, das sollte klappen.

Eigentlich wollte ich einfach nur die RadioButtons wertabhängig einfärben. Habe da aber bisher nichts zu gefunden, weshalb ich wohl den Umweg über eigene Icons gehen muss.

Oder habe ich das was übersehen?
 

membersound

Bekanntes Mitglied
Das ist ja merkwürdig. setForeground setzt bei mir definitiv die Textfarbe des RadioButtons. setBackground setzt die Farbe der ganzen RButton Komponente BIS AUF den runden Radio Dot selbst!

Können wir Code tauschen?


Java:
public class NewJPanel extends javax.swing.JPanel {
    private javax.swing.JRadioButton jRadioButton1;


    /** Creates new form NewJPanel */
    public NewJPanel() {
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jRadioButton1 = new javax.swing.JRadioButton();

        jRadioButton1.setBackground(new java.awt.Color(255, 0, 0));
        jRadioButton1.setForeground(new java.awt.Color(0, 0, 204));
        jRadioButton1.setText("jRadioButton1");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(163, Short.MAX_VALUE)
                .addComponent(jRadioButton1)
                .addGap(144, 144, 144))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(89, 89, 89)
                .addComponent(jRadioButton1)
                .addContainerGap(188, Short.MAX_VALUE))
        );
    }// </editor-fold>                        
   }
 

bERt0r

Top Contributor
Ok, setForeground ist laut javadoc nur ein "hint" für das LookAndFeel in welcher Farbe der Butten gezeichnet werden soll. Die meisten modernen LnFs kümmern sich in punkto Farbe des Buttons aber nicht darum, weil sie dafür ein eigenes Icon haben, das sie nunmal nicht umfärben.

Du kannst dich ein bisschen mit meinem Programm spielen. Leider färbt sich der Button nur in Kombination Metal lnf und (das veraltete) DefaultMetalTheme.
Java:
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.plaf.metal.DefaultMetalTheme;
import javax.swing.plaf.metal.MetalLookAndFeel;
import javax.swing.plaf.metal.OceanTheme;
import javax.swing.JRadioButton;
import java.awt.Color;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.UnsupportedLookAndFeelException;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
import javax.swing.LayoutStyle.ComponentPlacement;

public class ButtonTest extends JFrame {

	private JPanel contentPane;
	private JComboBox themeComboBox;
	private JComboBox lnfComboBox;
	

	class LnfWrap
	{
		LookAndFeelInfo i;
		LnfWrap(LookAndFeelInfo info)
		{
			i=info;
		}
		public String toString()
		{
			return i.getName();
		}
	}
	
	class  MyItemListener implements ItemListener {
		JFrame parent;
		MyItemListener(JFrame p)
		{
			parent=p;
		}
		public void itemStateChanged(ItemEvent e) 
		{
			if(e.getStateChange()==ItemEvent.SELECTED)
			{
				if(e.getSource()==lnfComboBox)
				{

					if(e.getItem() instanceof LnfWrap)
					{
						LnfWrap info=(LnfWrap)e.getItem();
						try {
							UIManager.setLookAndFeel(info.i.getClassName());
							SwingUtilities.updateComponentTreeUI(parent);
						} catch (ClassNotFoundException e1) {
							// TODO Auto-generated catch block
							e1.printStackTrace();
						} catch (InstantiationException e1) {
							// TODO Auto-generated catch block
							e1.printStackTrace();
						} catch (IllegalAccessException e1) {
							// TODO Auto-generated catch block
							e1.printStackTrace();
						} catch (UnsupportedLookAndFeelException e1) {
							// TODO Auto-generated catch block
							e1.printStackTrace();
						}
					}
				}
				else if(e.getSource()==themeComboBox)
				{
					if(e.getItem().equals("DefaultMetalTheme"))
					{
						MetalLookAndFeel.setCurrentTheme(new DefaultMetalTheme());
					}
					else if(e.getItem().equals("Ocean"))
					{
						MetalLookAndFeel.setCurrentTheme(new OceanTheme());
					}
					SwingUtilities.updateComponentTreeUI(parent);
				}
			}
		}
	};
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					ButtonTest frame = new ButtonTest();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public ButtonTest() {

		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		
		
		JRadioButton rButton = new JRadioButton("Ich werde nicht rot");
		rButton.setSelected(true);
		rButton.setForeground(Color.red);
		
		JLabel lblSetLookandfeel = new JLabel("Set LookAndFeel");
		
		lnfComboBox = new JComboBox();

		UIManager.LookAndFeelInfo[] infos=UIManager.getInstalledLookAndFeels();
		for(int i=0;i<infos.length;i++)
		{
			lnfComboBox.addItem(new LnfWrap(infos[i]));
		}
		
		JLabel lblSetThememetal = new JLabel("Set Theme (Metal only)");
		
		themeComboBox = new JComboBox();
		themeComboBox.addItem("Ocean");
		themeComboBox.addItem("DefaultMetalTheme");
		
		
		MyItemListener myListener=new MyItemListener(this);
		lnfComboBox.addItemListener(myListener);
		themeComboBox.addItemListener(myListener);
		
		
		GroupLayout gl_contentPane = new GroupLayout(contentPane);
		gl_contentPane.setHorizontalGroup(
			gl_contentPane.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_contentPane.createSequentialGroup()
					.addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
						.addComponent(rButton)
						.addComponent(themeComboBox, GroupLayout.PREFERRED_SIZE, 150, GroupLayout.PREFERRED_SIZE)
						.addComponent(lnfComboBox, GroupLayout.PREFERRED_SIZE, 150, GroupLayout.PREFERRED_SIZE)
						.addComponent(lblSetLookandfeel)
						.addComponent(lblSetThememetal))
					.addContainerGap(282, Short.MAX_VALUE))
		);
		gl_contentPane.setVerticalGroup(
			gl_contentPane.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_contentPane.createSequentialGroup()
					.addComponent(rButton)
					.addPreferredGap(ComponentPlacement.RELATED)
					.addComponent(lblSetLookandfeel)
					.addPreferredGap(ComponentPlacement.RELATED)
					.addComponent(lnfComboBox, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
					.addPreferredGap(ComponentPlacement.RELATED)
					.addComponent(lblSetThememetal)
					.addPreferredGap(ComponentPlacement.RELATED)
					.addComponent(themeComboBox, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
					.addGap(117))
		);
		contentPane.setLayout(gl_contentPane);

	}
}

Wenn du auf Biegen und Brechen deinen farbigen Button mit schöner UI haben willst, kannst du mit dem Nimbus lnf versuchen per UIManager.put("RadioButton[Selected].iconPainter", myIconPainter) das Icon zu verändern. Damit kenn ich mich aber nicht ganz aus, vielleicht läuft das ganze mit Java7 besser.
 

Shulyn

Bekanntes Mitglied
Du könntest wie bereits erläutert alles im ActionListener regeln.
[Java]
final ActionListener myActionListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(myRadioButton.isSelected()) {
myRadioButton.setIcon(new ImageIcon("/sel.png", "test"));
} else {
myRadioButton.setIcon(new ImageIcon("/deSel.png", "test"));
}
}
};
[/Java]

Oder du gehst über das LookAndFeel, dort ersetzt du die entsprechenden Icons einfach.
[Java]
DefaultLookAndFeel def = new DefaultLookAndFeel();
def.setRadioButtonImages(Image.createImage("/radio_on.png"), Image.createImage("/radio.png"));
UIManager.getInstance().setLookAndFeel(def);
[/Java]
 

Ähnliche Java Themen

Neue Themen


Oben