如何快速显示常规网格?

时间:2014-04-18 00:03:50

标签: java swing

我想显示400个大小相同JPanel的网格。通常的方法似乎是创建和布局所有面板,然后实际显示它们。然而,在我的应用程序中,大多数面板实际上都是隐藏的(想想“扫雷”,但面板要复杂得多),所以我希望能够显示一个“空”网格,然后将面板添加到因为我需要它们。我考虑过两种方法:

  1. 使用布局管理器进行分配,只需根据需要在适当的绝对坐标处添加面板。

  2. 使用布局管理器,但开始用虚拟组件填充表格,并在我去的时候用复杂的组件替换它们。

  3. 然而,使用这些方法中的任何一种,我似乎需要提前知道面板尺寸,而我不需要。我可以通过构建一个示例面板并测量它来解决这个问题,但这看起来相当丑陋,并且重复了一堆代码。还有其他方法可以做到这一点吗?

2 个答案:

答案 0 :(得分:5)

使用flyweight pattern仅渲染可见面板。该方法在JTable渲染器中进行了说明,并概述了here

答案 1 :(得分:4)

我不会在这里使用面板或自定义绘画。代替:

  • 组件:JToggleButton
  • 布局:GridLayout
  • Tiles:Icon(标准,专注,按压,选择等)

E.G。

enter image description here

import java.awt.*;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;

class MineSweeper {

    public static final int COLS = 20;
    public static final int ROWS = 20;

    public static void main(String[] args) throws Exception {
        URL urlDefault = new URL("http://i.stack.imgur.com/in9g1.png");
        URL urlPressed = new URL("http://i.stack.imgur.com/1lgtq.png");
        URL urlSelected = new URL("http://i.stack.imgur.com/wCF8S.png");
        final Image imgDefault = ImageIO.read(urlDefault);
        final Image imgPressed = ImageIO.read(urlPressed);
        final Image imgSelected = ImageIO.read(urlSelected);
        Runnable r = new Runnable() {

            @Override
            public void run() {
                JPanel gui = new JPanel(new GridLayout(ROWS, COLS, 2, 2));
                ImageIcon iiDefault = new ImageIcon(imgDefault);
                for (int ii = 0; ii < COLS; ii++) {
                    for (int jj = 0; jj < ROWS; jj++) {
                        JToggleButton tb = new JToggleButton(iiDefault);
                        tb.setContentAreaFilled(false);
                        tb.setMargin(new Insets(0,0,0,0));
                        tb.setPressedIcon(new ImageIcon(imgPressed));
                        tb.setSelectedIcon(new ImageIcon(imgSelected));
                        gui.add(tb);
                    }
                }

                JOptionPane.showMessageDialog(null, gui);
            }
        };
        // Swing GUIs should be created and updated on the EDT
        // http://docs.oracle.com/javase/tutorial/uiswing/concurrency
        SwingUtilities.invokeLater(r);
    }
}