有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在JPanel中创建可见网格

我想做的

我想创建一个API(个人API),允许我输入一个维度(比如10x10),它创建一个10个正方形乘10个正方形的可见网格,并添加了一个“功能”,可以通过方法调用更改任何正方形的填充。不尝试使用任何类型的mouse listener或任何listener

我的思维过程是这样的: 让保存网格的主JPanel递归地添加'box'objects,并用一个array位置引用每一个。我的问题不是主要的问题,我已经很容易地解决了。我的问题是object它正在添加。我不知道这应该是什么样的component。我尝试使用JPanel,但无法使任何内容可见。此外,“网格”外观也不会出现

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


共 (2) 个答案

  1. # 1 楼答案

    1. 拥有一个MainPanel类,该类接受维度arumges,并基于指定维度将其布局设置为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属性的自定义面板,在其中调用它的draw方法

      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. MainPanel类中创建DrawPanels的2D数组,如果需要,您可以通过索引访问它们

      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());
      
  2. # 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