java - poner - Cambiar el color de fondo subyacente de una ventana oscilante
manejo de jtabbedpane (3)
Como se discutió aquí , al cambiar el tamaño de una aplicación Swing en Vista (y Windows 7, que es lo que estoy usando) se obtiene un fondo negro en la esquina derecha / inferior, mientras que el repintar de Swing alcanza los cambios.
Jugando con otras aplicaciones (Windows Explorer (Native), Firefox (C ++?) Y Eclipse (Java)) Noto que todos tienen el mismo problema, al contrario de lo que dicen las personas en el enlace de arriba, pero minimizan el problema tiene un color de relleno gris, que es mucho menos discordante visualmente que el negro que aparece en Swing.
Me pregunto si hay alguna forma de cambiar esto para que Swing se comporte como estas otras aplicaciones. Intenté establecer el color de fondo del JFrame, pero fue en vano.
Información adicional Jonas descubrió (ver su respuesta informativa a continuación) que este es un problema con JFrames, pero no con AWT Frames, tal vez eso ayude a alguien a resolver esto.
He notado el mismo problema. Este color es gris en IE, en Opera es negro, y en Eclipse es gris. Se ve más visible en Swing, porque parece ser un poco más lento en el repintado y el color es como dijiste, negro . Este problema es más visible si usa la esquina superior izquierda para cambiar el tamaño.
Codifiqué un ejemplo e intenté entender dónde se define este color negro. Un JFrame tiene muchas capas , por lo que configuro un fondo diferente en cada capa.
import java.awt.Color;
import javax.swing.JFrame;
public class BFrame {
public static void main(String[] args) {
new JFrame() {{
super.setBackground(Color.CYAN);
this.getRootPane().setBackground(Color.BLUE);
this.getLayeredPane().setBackground(Color.RED);
this.getContentPane().setBackground(Color.YELLOW);
this.setSize(400,340);
this.setVisible(true);
}};
}
}
Pero este ejemplo no ayudó. Y tal vez el color lo establece una superclase en Frame .
java.lang.Object
java.awt.Component
java.awt.Container
java.awt.Window
java.awt.Frame
Mi teoría es que, como Swing se pinta a sí mismo, pero usa una ventana nativa, entonces se pinta el fondo original antes de cambiar el tamaño, y el fondo de Swing se pinta después del cambio de tamaño. Pero para las aplicaciones nativas, el fondo se pinta antes del cambio de tamaño.
ACTUALIZACIÓN: Intenté con un Marco ahora, y no está teniendo el mismo problema. La costura de fondo para pintar antes de cambiar el tamaño.
import java.awt.Color;
import java.awt.Frame;
public class B2Frame extends Frame {
public static void main(String[] args) {
new Frame() {{
setBackground(Color.YELLOW);
setSize(400,340);
setVisible(true);
}};
}
}
También noté esto. Para mí, este problema se resolvió con el cambio de administrador de diseño (he usado Free Form Layout antes) y funcionó bastante bien (pintura a color del sistema).
Pero finalmente cambié a FFL. También algunas aplicaciones conocidas se enfrentan a este problema (SKYPE), pero en realidad no me importa ...
El marco es responsable de pintar su fondo, por lo que debe asegurarse de dejar que haga su trabajo.
Usted demuestra esto estableciendo:
System.setProperty("sun.awt.noerasebackground", "true");
Esto hará que el fondo siempre sea negro en expansiones de tamaño. (Entonces no lo hagas)
Lo siguiente funcionó para mí:
(Solo AWT) Configure doble almacenamiento en búfer usando
createBufferStrategy(2)
- envuelto enaddNotify()
contrario, se encontrará con excepciones durante la creación del Marco(El paso 1 solo es necesario en AWT ya que Swing tiene doble buffer por defecto).
Siempre (importante) llame a
super()
en su implementaciónFrame.paint()
Establezca el color de fondo con
setBackground()
luego el fondo siempre debe ser del mismo color al expandir el marco
Código de muestra:
class InnerFrame extends Frame {
public void addNotify() {
super.addNotify();
// Buffer
createBufferStrategy(2);
strategy = getBufferStrategy();
}
public void paint(Graphics g) {
super(g);
//...
}
//...
}