【问题标题】:Create and add a 2D image array in swing在 swing 中创建并添加一个 2D 图像数组
【发布时间】:2015-05-16 18:14:14
【问题描述】:

我正在尝试练习我相当糟糕的 Java,我偶然发现了这个网站。 http://www.homeandlearn.co.uk/exercises/programming_exercises.html

我正在做练习 6,练习是使用黑色和白色单词创建一个 2d 字符串棋盘。这看起来像

http://www.homeandlearn.co.uk/exercises/images/checkerboard.png

我这样做并没有太大问题,但我想进一步挑战自己。我修改了程序(或尝试)以创建一个实际的 2d 棋盘,就像棋盘一样,但失败了。

这是我的 swing 代码:

import java.applet.*;
import java.awt.*;
import javax.swing.*;
public class exercise6 extends JFrame{
public Image black; 
public Image white; 
JPanel p = new JPanel();
public int rows = 8;
public Image checkerboard[][] = new Image[rows][rows];
   public static void main(String[] args) {



   for(int i=0; i<rows; i++) {
        for(int j=0; j<rows; j++) {

            if(i == j)
               checkerboard[i][j] = white;
           else if(i== j-2)
                checkerboard[i][j] = white;
           else if(i== j+2)
               checkerboard[i][j] = white;
           else if(i==j-4)
               checkerboard[i][j] = white;
           else if(i==j+4)
               checkerboard[i][j] = white;
           else
               checkerboard[i][j] = black;
       }    
   }
   new exercise6();
}//ends the main method

public exercise6() {
    super("Checkerboard");
    setResizable(false);
    setSize(800,800);
    setDefaultCloseOperation(CLOSE_ON_EXIT);
    p.add(checkerboard);
    add(p);
    setVisible(true);


}
}

这是我工作时的代码:

public class checkerboard{

public static void main(String[] args) {
 int rows = 8;
String checkerboard[][] = new String[rows][rows];   

for(int i=0; i<rows; i++) {
    for(int j=0; j<rows; j++) {

        if(i == j)
            checkerboard[i][j] = "white ";
        else if(i== j-2)
            checkerboard[i][j] = "white ";
        else if(i== j+2)
            checkerboard[i][j] = "white ";
        else if(i==j-4)
            checkerboard[i][j] = "white ";
        else if(i==j+4)
            checkerboard[i][j] = "white ";
        else if(i==j+6)
            checkerboard[i][j] = "white ";
        else if(i==j-6)
            checkerboard[i][j] = "white ";
        else
            checkerboard[i][j] = "black ";
        System.out.print(checkerboard[i][j]);
    }
    System.out.println();
    }   
}

}

【问题讨论】:

  • 您能解释一下出了什么问题吗?谢谢。
  • 是的,它可以编译,但是命令提示符会抛出 8 个“无法从静态上下文引用非静态变量”的错误,而且我似乎搞砸了默认的关闭操作行。跨度>
  • 不,由于上述错误原因,它无法编译。
  • 很抱歉,我不知道您的意思是它是否通过编译器没有错误,或者我是否可以编译它。好的,谢谢,我以后编写更多代码时会记住这一点
  • 查看stackoverflow.com/a/30200222/300257,了解制作 Swing 棋盘格所涉及的内容。它涉及使用model / view / controller pattern 并对正方形进行建模。

标签: java image swing multidimensional-array


【解决方案1】:

建议:

  • 要绘制棋盘格,您必须在某物内部进行绘制,我建议您在 JPanel 内部进行绘制,或者更准确地说,在扩展 JPanel 的类内部进行绘制。
  • 然后您将在 JPanel 的 paintComponent(Graphics g) 方法中进行绘制。
  • 重写此方法时,请确保首先调用 super 的方法 super.paintComponent(g),以便 JPanel 可以对自己及其子组件进行自己的内务绘制。
  • 一个简单的方法来判断将哪个正方形涂成白色或黑色,看看行和列是偶数还是奇数,换句话说,如果正方形的行和列都是偶数或都是奇数,则将它们涂成一种颜色,如果一个是偶数而另一个是奇数,则给它们涂上另一种颜色。这可以使用 mod 运算符进行测试,% 并测试变量 mod 2 是否相同:if (row % 2 == col % 2)
  • 您无法将图像数组添加到 JPanel 并编译您的代码。切勿通过猜测来编造代码,而是使用Java API 来准确查看每个核心 Java 类允许使用哪些方法。

例如:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.*;

// extend JPanel so you can draw within it
public class SimpleCheckerboard extends JPanel {
   public static final int ROWS = 8;
   private static final int PREF_W = 60 * ROWS;
   private static final int PREF_H = PREF_W;

   public SimpleCheckerboard() {
      // TODO Auto-generated constructor stub
   }

   // the method that does the drawing:
   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      for (int row = 0; row < ROWS; row++) {
         for (int col = 0; col < ROWS; col++) {
            // choose a Color black or white depending on row and col

            Color c = Color.white;
            if (row % 2 == col % 2) {
               c = Color.black;
            }

            // this would work too!
            // Color c = (row % 2 == col % 2) ? Color.BLACK : Color.WHITE;
            g.setColor(c);

            int x = (col * getWidth()) / ROWS;
            int y = (row * getHeight()) / ROWS;
            int w = getWidth() / ROWS;
            int h = getHeight() / ROWS;

            g.fillRect(x, y, w, h);
         }
      }
   }

   @Override  // set size of our GUI
   public Dimension getPreferredSize() {
      if (isPreferredSizeSet()) {
         return super.getPreferredSize();
      }
      return new Dimension(PREF_W, PREF_H);
   }

   private static void createAndShowGui() {
      SimpleCheckerboard mainPanel = new SimpleCheckerboard();

      JFrame frame = new JFrame("SimpleCheckerboard");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      // call our code in a Swing thread-safe way:
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

【讨论】:

  • 所以我所做的甚至不接近正确。我没有画任何东西,你找到了一种巧妙的方法来将我的“算法”(或缺乏算法)合并并浓缩到绘画中。谢谢。我会考虑一下,看看我是否可以在我尝试用图像做任何其他事情并让自己看起来像个傻瓜之前重新挥杆。
  • @trailrunnersquared:如果您想学习 Swing 编码,可以在此处找到 Swing 教程和其他 Swing 资源的链接:Swing Info。我必须警告您,Java 的力量已经决定不再进一步增强库,而是将精力放在 JavaFx 背后作为其替代品。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
  • 2013-11-22
  • 1970-01-01
相关资源
最近更新 更多