繁体   English   中英

如何快速显示常规网格?

[英]How can I display a regular grid quickly?

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

  1. 无需布局管理器,只需根据需要在适当的绝对坐标处添加面板。

  2. 使用布局管理器,但首先要在表中填充虚拟组件,然后将它们替换为复杂的组件。

但是,使用这两种方法中的任何一种,我似乎都需要事先知道面板尺寸,而我不需要。 我可以通过构建示例面板并对其进行测量来解决此问题,但这似乎很丑陋,并且重复了一堆代码。 还有其他方法吗?

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

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

  • 组件: JToggleButton
  • 布局: GridLayout
  • 磁贴: Icon (标准,聚焦,按下,选中等)

例如

在此处输入图片说明

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM