Pregunta

Estoy desarrollando una aplicación Java de escritorio. En ella tengo 4 JButtons en un JPanel. Ahora quiero que cada vez que un botón se hace clic en sus cambios de color de fondo a algún otro color (digamos naranja) para representar que se ha hecho click y el color de fondo de todos los otros 3 botones restablecer a su color por defecto (en caso de que alguno de ellos tenía Naranja color de fondo).

Así que, en un momento único botón puede tener el color naranja.

El enfoque actual que he aplicado es que he implementado el código siguiente en el método xxxActionPerformed() de JButton button1

button1.setBackground(Color.Orange);
button2.setBackground(Color.Gray);
button3.setBackground(Color.Gray);
button4.setBackground(Color.Gray);

y lo mismo para los tres botones de descanso.

Ahora en reales, no quiero el color como fondo de color gris (para el botón unclicked). En su lugar, quiero que el color de fondo por defecto para que el color fondo de color se ajustará a la apariencia y la sensación de la interfaz gráfica de usuario de acuerdo con la plataforma del usuario final look-and-feel.

Q1. ¿Cómo puedo obtener el color de fondo por defecto?

Q2. Es este el enfoque correcto para hacer esto o ¿Hay algún otro mecanismo a través del cual puedo agrupar todos los cuatro botones en un grupo de botones de modo que sólo uno puede tener la propiedad especificada en un momento (como botones de radio)?

¿Fue útil?

Solución

  1. sólo tiene que utilizar null utilizar el color predeterminado:

    button1.setBackground(Color.ORANGE);
    button2.setBackground(null);
    ...
    
  2. considere el uso de JToggleButtons con un ButtonGroup, establecer el icono y PressedIcon de los botones. No es necesario cambiar el color de fondo.

    button1 = new JToggleButton(new ImageIcon("0.jpg"));
    button1.setSelectedIcon(new ImageIcon("1.jpg"));
    button2 = new JToggleButton(new ImageIcon("0.jpg"));
    button2.setSelectedIcon(new ImageIcon("2.jpg"));
    ...
    ButtonGroup group = new ButtonGroup();
    group.add(button1);
    group.add(button2);
    ...
    

Otros consejos

Usted puede obtener el color de fondo para los botones estándar de la UIManager:

button1.setBackground(UIManager.getColor("Button.background"));

Por lo que yo sé, las teclas podrían cambiar en un aspecto diferente y se siente. Aquí es una aplicación Web Start agradable que muestra todas las claves disponibles:

http://tips4java.wordpress.com/2008/10/09 / UIManager-defaults /

Esta es una sección transversal de "Button.background" en base a este ejemplo :

*** Metal javax.swing.plaf.metal.MetalLookAndFeel 636 entries
Button.background: javax.swing.plaf.ColorUIResource[r=238,g=238,b=238]

*** Nimbus com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel 1052 entries
Button.background: com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel$NimbusProperty@60961dff

*** CDE/Motif com.sun.java.swing.plaf.motif.MotifLookAndFeel 550 entries
Button.background: javax.swing.plaf.ColorUIResource[r=174,g=178,b=195]

*** Mac OS X com.apple.laf.AquaLookAndFeel 705 entries
Button.background: com.apple.laf.AquaNativeResources$CColorPaintUIResource[r=238,g=238,b=238]

Q1 .: Para obtener el color de interfaz gráfica de usuario del botón, simplemente hacer esto

button1.setBackground(Color.Orange);
button2.setBackground(java.awt.SystemColor.control);
button3.setBackground(java.awt.SystemColor.control);
button4.setBackground(java.awt.SystemColor.control);

Con esta clase (java.awt.SystemColor. *), Se puede obtener el color de todos los elementos de la interfaz de usuario.

Q2 .: Nunca he oído hablar de la agrupación de botones. Entonces, no puedo responder a esta uno.

Espero que ayuda.

Si lo desea, puede rediseñar toda la interfaz de usuario botón

public class buttonUI extends javax.swing.plaf.basic.BasicButtonUI{

buttonUI(JButton b){
    b.setContentAreaFilled(false);
}

@Override
    public void paint(Graphics g,JComponent c){
             Graphics2D g2d = (Graphics2D) g;
             g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
             AbstractButton b = (AbstractButton) c;
             g2d.setFont(font.deriveFont(11f));
             Dimension d = b.getSize();
             FontMetrics fm = g2d.getFontMetrics();
             g2d.setColor(new Color(100,100,100));
             String caption = b.getText();
             int x = (d.width - fm.stringWidth(caption)) / 2;
             int y = (d.height + fm.getAscent()) / 2 - 2;
             g2d.drawString(caption, x, y);        
        }   }

y en su pieza principal del uso de código como

jButton1.setUI(new buttonUI(jButton1));

Esto cómo lo uso .. usted puede tener su propia manera demasiado

¿Has mirado en el patrón decorador en Java pasa un botón en un método que decora dependiendo de si el botón es la corriente activa, por ejemplo, si se movía sobre.

public Jbutton decorateButton(JButton b, boolean isHoveredOver){
    if(isHoveredOver)
        b.setBackground(getContentPane().getBackground().GREEN);
    return b;
}

se llama a este método desde el MouseEvent o métodos ActionEvent y simplemente emite un repintado () después. poner todos los botones en una matriz o vector y bucle a través de él que pasa cada uno en el método decorateButton y dar el valor booleano initail de falso a continuación en el evento puso a verdadero. De esta manera el valor inicial es por defecto y el botón es entonces decorado sobre la acción aparecerán los botones para actuar como parte de un grupo

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top