[英]How can I display a regular grid quickly?
我想显示400个相同大小的JPanel
的网格。 通常的方法似乎是创建并布置所有面板,然后实际显示它们。 但是,在我的应用程序中,大多数面板实际上都是隐藏起来的(想想是“扫雷”,但面板要复杂得多),所以我希望能够显示“空”网格,然后将面板添加到因为我需要他们。 我考虑过两种方法:
无需布局管理器,只需根据需要在适当的绝对坐标处添加面板。
使用布局管理器,但首先要在表中填充虚拟组件,然后将它们替换为复杂的组件。
但是,使用这两种方法中的任何一种,我似乎都需要事先知道面板尺寸,而我不需要。 我可以通过构建示例面板并对其进行测量来解决此问题,但这似乎很丑陋,并且重复了一堆代码。 还有其他方法吗?
使用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.