java swing jframe repaint

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; }