我想显示400个大小相同JPanel
的网格。通常的方法似乎是创建和布局所有面板,然后实际显示它们。然而,在我的应用程序中,大多数面板实际上都是隐藏的(想想“扫雷”,但面板要复杂得多),所以我希望能够显示一个“空”网格,然后将面板添加到因为我需要它们。我考虑过两种方法:
使用布局管理器进行分配,只需根据需要在适当的绝对坐标处添加面板。
使用布局管理器,但开始用虚拟组件填充表格,并在我去的时候用复杂的组件替换它们。
然而,使用这些方法中的任何一种,我似乎需要提前知道面板尺寸,而我不需要。我可以通过构建一个示例面板并测量它来解决这个问题,但这看起来相当丑陋,并且重复了一堆代码。还有其他方法可以做到这一点吗?
答案 0 :(得分:5)
使用flyweight pattern仅渲染可见面板。该方法在JTable
渲染器中进行了说明,并概述了here。
答案 1 :(得分:4)
我不会在这里使用面板或自定义绘画。代替:
JToggleButton
GridLayout
Icon
(标准,专注,按压,选择等)E.G。
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);
}
}