Cambiando el fondo de JButton

Tengo un Swing JButton y también estoy usando el siguiente código para mi proyecto:

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 

Ahora cuando intente cambiar el fondo de un botón con btnNewButton.setBackground(Color.RED); no se vuelve rojo, solo los bordes se vuelven rojos.

¿Cómo puedo cambiar este fondo a rojo mientras sigo usando UIManager.getSystemLookAndFeelClassName() para el rest de los componentes / proyecto?

Eche un vistazo al error 4880747: XP L&F: REGRESSION: setBackground en JButton establece el color del borde en Windows XP . La sección de evaluación establece:

Cambiar la apariencia de un botón siempre puede causar conflictos con la implementación actual de L&F. Windows L&F for Swing intenta estar lo más cerca posible de la pantalla nativa. En XP, usamos los recursos de bitmap incorporados para los botones. Estos no pueden ser coloreados, al igual que en la API nativa.

Debería llamar a setContentAreaFilled (false) en el botón para evitar que el L & F pinte sus decoraciones. Esto tiene el efecto secundario de que la propiedad opaca del botón se establece en false, por lo que debe seguir esa llamada con una llamada a setOpaque (true).

Esto no es un error y se cerrará.

Como se indicó, setContentAreaFilled(false) y setOpaque(true) harán el truco, pero el botón se verá diferente.

Si vale la pena, puedes crear tu propio ButtonUI . Aquí hay un gran ejemplo de @mKorbel que puede encontrar útil.

Esto depende de lo que quieras lograr.

Podría usar JButton#setContentAreaFilled pasándolo falso, pero probablemente también necesite llamar a JButton#setBorderPainted pasándolo

También puede cambiar el valor predeterminado de UIManager para el fondo de los botones

Debes hacer el JButton opaco:

 btnNewButton.setOpaque(true); 

Según lo especificado para JComponent#setBackground método JComponent#setBackground de JComponent#setBackground en la documentación de JComponent#setBackground :

Establece el color de fondo de este componente. El color de fondo se usa solo si el componente es opaco, y solo por subclases de JComponent o ComponentUI implementaciones. Las subclases directas de JComponent deben reemplazar a paintComponent para respetar esta propiedad.

Depende de la apariencia de respetar esta propiedad, algunos pueden optar por ignorarla.

Creo que la apariencia actual no es compatible con esta propiedad … Por eso, en este caso, se ignora el color de fondo.