在JPanel中创建可见网格

时间:2014-04-29 17:04:01

标签: java swing graphics

我正在尝试做什么

我想创建一个允许我输入尺寸(例如10x10)的API(个人版),它会创建一个10个正方形,10个正方形的可见网格,并添加了能够更改填充的“特征”通过方法调用的任何方块。不要尝试使用任何类型的mouse listener或任何listener

我的思维过程是这样的: 让持有网格的主JPanel递归地添加'box'objects并引用每个array位置。我的问题不是主要JPanel,我已经足够轻松了。我的问题是object它正在添加。我无法弄清楚这应该是什么component。我尝试使用JPanel但无法看到任何内容。此外,“网格”外观也不会存在。

我猜我将不得不使用swing.GraphicsGraphics2D,但我在网上找到的每个例子都不适合我。寻找有关使用Graphics的建议,或者如果有更好的方法来获得我想要的东西,我很乐意尝试一下。

2 个答案:

答案 0 :(得分:2)

  1. 拥有一个MainPanel类,该类获取维度,并根据指定的维度将其布局设置为GridLayout

    public class MainPanel extends JPanel {
        public MainPanel(int rows, int cols) {
            setLayout(new GridLayout(rows, cols));
        }
    }
    
  2. 创建一个具有draw()方法

    的界面
    public interface Drawable {
        void draw(Graphics g);
    }
    
  3. 创建一个具有Drawable属性的自定义面板,您可以在其中调用它的绘制方法

    public class DrawPanel extends JPanel {
        private Drawable drawable;
    
        public DrawPanel() {}
    
        public DrawPanel(Drawable drawable) {
            this.drawable = drawable;
        }
    
        public void setDrawable(Drawable drawable) {
            this.drawable = drawable;
            repaint();
        }
    
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (drawable != null) {
                drawable.draw(g);
            }
        }
    }
    
  4. DrawPanels课程中创建MainPanel的二维数组,只要您可以按索引访问它们,如果需要

    public class MainPanel extends JPanel {
        private DrawPanel[][] panels;
        public MainPanel(int rows, int cols) {
            setLayout(new GridLayout(rows, cols));
            panels = new DrawPanel[rows][cols];
        }
    }
    
  5. 使用new DrawPanel填充数组并将其添加到MainPanel

    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            DrawPanel panel = new DrawPanel();
            panels[i][j] = panel;
            MainPanel.this.add(panel);
        }
    }
    
  6. 使用您想要的任何/多少实现实现Drawable接口。像

    public class Ball implements Drawable {
        private int x, y;
        private JPanel surface;
        public Ball(int x, int y, JPanel surface) {
            this.x = x;
            this.y = y;
            this.surface = surface;
        }
    
        @Override
        public void draw(Graphics g) {
            g.fillOval(x, y, sirface.getWidth(), surface.getHeight());
        }
    }
    
  7. 将可绘制对象添加到面板

    JPanel panel = panels[3][4];
    panel.setDrawable(new Ball(0, 0, panel));
    
  8. 您可以根据需要制作Drawable的任意数量的不同实现,并且每个面板可以绘制不同的对象。

    public class Midget implements Drawable {
        @Override
        public void draw(Graphics g) {
            // draw midget
        }
    }
    ....
    panels[5][5].setDrawable(new Midget());
    

答案 1 :(得分:2)

使用JLabel

尝试以下示例代码
JPanel panel = new JPanel(new GridLayout(10, 10));
JLabel[] labels = new JLabel[20];

Color[] colors = new Color[] { Color.GREEN, Color.RED, Color.BLUE };
Random random = new Random();

for (int i = 0; i < labels.length; i++) {
    JLabel label = new JLabel();

    label.setBackground(colors[random.nextInt(colors.length)]);
    label.setOpaque(true);

    panel.add(label);
    labels[i] = label;
}

快照:

enter image description here