Java 重新绘制JFrame lag/pop in

Java 重新绘制JFrame lag/pop in,java,swing,jframe,repaint,Java,Swing,Jframe,Repaint,我在重新绘制包含数百个JFrame的JFrame时遇到了一个问题。我有一个应用程序,每个磁贴都是一个JFrame。当我尝试重新验证JFrame并重新绘制JFrame时,可以明显看到随机分幅出现 为了解决这个问题,我创建了一个覆盖旧地图的JPanel(盲板),然后旧地图被移除。只有到那时我才能重新画。然后我添加新地图并移除“盲板”,然后重新绘制 有没有更好的办法。一些弹出窗口仍然可见 public void refreshMap(){ JPanel blinds = new JPanel(

我在重新绘制包含数百个
JFrame
JFrame
时遇到了一个问题。我有一个应用程序,每个磁贴都是一个
JFrame
。当我尝试重新验证
JFrame
并重新绘制
JFrame
时,可以明显看到随机分幅出现

为了解决这个问题,我创建了一个覆盖旧地图的
JPanel
(盲板),然后旧地图被移除。只有到那时我才能重新画。然后我添加新地图并移除“盲板”,然后重新绘制

有没有更好的办法。一些弹出窗口仍然可见

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

如果做得好的话,应该会有最小的延迟,在您的瓷砖的变化,但我不确定您的代码和解释,目前可以告诉我们,你卡住了。例如,运行此代码(my)以查看瓷砖以最小的延迟更改颜色,并且没有任何瑕疵

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();
         }
      });
   }
}
导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.GridLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.image.buffereImage;
导入java.util.Random;
导入javax.swing.*;
公共类SquareGridTest扩展了JPanel{
公共静态最终颜色[]颜色={Color.blue,Color.red,Color.yellow,
颜色。橙色,颜色。绿色,颜色。青色,颜色。浅灰色,颜色。洋红,
Color.white,Color.black};
私有静态最终图标[]图标=新图标[COLORS.length];
私有静态最终整数行=20;
专用静态最终整数=30;
专用静态最终int BI_宽度=20;
专用静态最终int BI_高度=BI_宽度;
专用静态最终int定时器_延迟=15;
受保护的静态最终整数交换=15;
私有JLabel[][]网格=新JLabel[行][COLS];
私有随机=新随机();
静止的{
对于(int i=0;i


<>为了更详细地帮助您的代码,并帮助我们更好地理解您的问题,考虑创建和发布您自己的.< /p> <代码> >我有一个问题,它重新绘制了一个包含数百个JFrice的JFrm。我有一个应用程序绘制了一个“基于瓦片的”地图,每个瓦片是一个JFrror。这是一个非常不寻常的程序设计,一个我永远不会推荐的。我很乐意帮助你改变这一点,但需要更多的信息来了解你正在尝试做什么,以及你试图实现的总体效果。请注意,一个应用程序通常会创建一个JFrame、一个主父窗口,就是这样。我需要能够以网格模式添加OP中链接的图片中所示的正方形,我意识到制作100个JPanel是一个巨大的浪费,但我不知道还有什么可以尝试。我需要能够显示~20*~15个方格。目前它由377块瓷砖组成。这太神奇了。谢谢你的帮助。我看到你只改变了实际改变的正方形,这是我认为最主要的事情。我试图在每次刷新时重新加载整个地图。我将尝试在代码中使用相同的逻辑。我将在完成转换后向您汇报。