java - Redibujar JFrame lag/pop-in
swing repaint (1)
Si lo haces bien, habrá un retraso mínimo en el cambio de fichas, pero no estoy seguro de que tu código y tu explicación puedan decirnos actualmente dónde estás atrapado. Por ejemplo, ejecute este código (mi programa de ejemplo mínimo ) para ver las fichas cambiando de color con un retraso mínimo y sin artefactos.
import java.awt.Color;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.util.Random;
import javax.swing.*;
public class SquareGridTest extends JPanel {
public static final Color[] COLORS = { Color.blue, Color.red, Color.yellow,
Color.orange, Color.green, Color.cyan, Color.lightGray, Color.magenta,
Color.white, Color.black };
private static final Icon[] ICONS = new Icon[COLORS.length];
private static final int ROWS = 20;
private static final int COLS = 30;
private static final int BI_WIDTH = 20;
private static final int BI_HEIGHT = BI_WIDTH;
private static final int TIMER_DELAY = 15;
protected static final int NUMBER_TO_SWAP = 15;
private JLabel[][] grid = new JLabel[ROWS][COLS];
private Random random = new Random();
static {
for (int i = 0; i < ICONS.length; i++) {
BufferedImage img = new BufferedImage(BI_WIDTH, BI_HEIGHT, BufferedImage.TYPE_INT_ARGB);
Graphics g = img.getGraphics();
g.setColor(COLORS[i]);
g.fillRect(0, 0, BI_WIDTH, BI_HEIGHT);
g.dispose();
ICONS[i] = new ImageIcon(img);
}
}
public SquareGridTest() {
setLayout(new GridLayout(ROWS, COLS));
for (int row = 0; row < grid.length; row++) {
for (int col = 0; col < grid[row].length; col++) {
JLabel label = new JLabel();
int index = random.nextInt(COLORS.length);
label.setIcon(ICONS[index]);
add(label);
grid[row][col] = label;
}
}
new Timer(TIMER_DELAY, new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
for (int i = 0; i < NUMBER_TO_SWAP; i++) {
int row = random.nextInt(ROWS);
int col = random.nextInt(COLS);
int iconIndex = random.nextInt(ICONS.length);
grid[row][col].setIcon(ICONS[iconIndex]);
}
}
}).start();
}
private static void createAndShowGui() {
SquareGridTest mainPanel = new SquareGridTest();
JFrame frame = new JFrame("SquareGridTest");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
Para obtener ayuda más detallada con su código y para ayudarnos a comprender mejor su problema, considere crear y publicar su propio programa de ejemplo mínimo .
Tengo un problema con el redibujado de un JFrame
que contiene cientos de JFrames
dentro de él. Tengo una aplicación que dibuja un mapa "basado en mosaico" y cada tesela es un JFrame
. Cuando trato de revalidate
y volver a dibujar el JFrame
, puede ver visiblemente las fichas aleatorias que aparecen.
Para combatir esto, he creado un JPanel
(persianas) que pasa por el mapa antiguo, y luego se elimina el mapa anterior. Solo entonces vuelvo a dibujar. Luego agrego el nuevo mapa y elimino el "oculto" y luego vuelvo a dibujar de nuevo.
Hay una mejor manera de hacer esto. Algunos pop-in aún son visibles.
public void refreshMap(){
JPanel blinds = new JPanel();
blinds.setBackground(oCreator.getColorLight());
blinds.setBounds(0, 0, length, height);
add(blinds);
if(currentMap != null){
remove(currentMap);
}
revalidate();
repaint();
JPanel newMap = addMapPanel(map);
newMap.setBounds(((length-absoluteMapLength)/2), ((height-absoluteMapHeight)/2), absoluteMapLength, absoluteMapHeight);
remove(blinds);
revalidate();
repaint();
add(newMap);
currentMap = newMap;
}