当前位置: 首页 > 知识库问答 >
问题:

为什么没有画正方形?

许沛
2023-03-14

我启动了一个国际象棋项目,使用一些旧代码绘制地图,基本上所有内容都是复制粘贴的。问题是方块没有出现?我试着修了一会儿,但没有找到解决办法。下面可能是三种最重要的方法,并简要介绍了整个项目。有些是德语的。

https://drive.google.com/file/d/1nnZHLB0Ycy04eMyYbEmduMwbGhVLZ2VB/view?usp=sharing

public SchachFrame() {
        super();
        contentPane = new JPanel();
        setContentPane(contentPane);
        setBounds(0, 0, window.width, window.height);
        contentPane.setBackground(Color.darkGray);
        contentPane.setVisible(true);
        
        ge = new GameEnvironment(this);
        ge.setBounds(window.width/2 - 500, window.height/2 - 500, 1000, 1000);
        ge.setVisible(true);
        contentPane.add(ge);
        
        Thread gameEnvironment = new Thread(ge);
        gameEnvironment.start();
        
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    } 


public void createMap(int width, int length, GameEnvironment ge) {
        map = new Spielfeld[length][width];
        Spielfeld.width = 1000/width;
        Spielfeld.height = 1000/length;
        for(int i = 0; i < length; i++) {
            for(int j = 0; j < width; j++) {
                this.map[i][j] = new Spielfeld(j, i, null);
                this.map[i][j].setBounds(ge.getX() + j * Spielfeld.width, ge.getY() + i * Spielfeld.height, Spielfeld.width, Spielfeld.height);
                this.map[i][j].setVisible(true);
                ge.add(this.map[i][j]);
            }
        }
    }


public void paintComponent(Graphics g) {
        if((this.px + this.py) % 2 == 0) {
            g.setColor(Color.blue);
        } else {
            g.setColor(Color.cyan);
        }
        g.fillRect(this.getX(), this.getY(), this.getWidth(), this.getHeight());
        repaint();
    }

共有1个答案

薛云瀚
2023-03-14

不要在paintComponent中调用repaint()。否则,您将永远不会存在EDT并锁定您的代码。paintComponent(图形g)中的第一个语句应该是super.paintComponent(g);

看起来你要画坐标。每次调用paintComponent时,都会覆盖前面的正方形。因此,当px和py发生变化时,它们应该放在一个数组中。数组应该在paintComponent中迭代以绘制它们。

 类似资料:
  • 问题内容: Iterables提供了两种方法 但只有一个 是否存在任何破坏对称性的设计/实现原因? 问题答案: 我认为要点是,没有理由可以使用来完成此操作。Guava尽力使API保持较小,因此没有添加可以/应该以其他方式轻松完成的事情。 另一方面,还没有一种机制可以测试iterable是否为空,如果是,则返回默认值而不是第一个值。因此,。 同样,没有简单的方法来获取最后一个元素,因此和

  • 问题内容: 虽然有一种方法没有。这是为什么?文件在完成后会自动关闭吗? 谢谢! 问题答案: 该类的javadoc将类描述为: 文件和目录路径名的抽象表示。 只是路径名的一种表示形式,有一些关于文件系统(如)和目录处理的方法,但是实际的流输入和输出在其他地方完成。流可以打开和关闭,文件不能。 (我个人的看法是,不幸的是Sun后来继续创建,给命名不一致带来了很大的困惑。)

  • 当使用Java8流时,获取一个列表、从中创建一个流、处理业务并将其转换回来是很常见的。类似于: 有什么想法吗?

  • 首先,我看了这里所有其他类似的帖子,但没有一个能帮上忙。我正在写一个扫雷游戏,我试图在JFrame的边界布局顶部放置一个Jlabel,并让它显示一个计数器,指示还有多少地雷需要标记。每当单击网格上的任何其他JLabel时,都需要重新绘制它。首先,对于我的代码,我的标题JLabel上从来没有显示任何文本。让文本显示的唯一方法是将其放入我的JLabel构造函数中。这让我觉得我的paintCompone

  • 问题内容: 我正在尝试做这样的事情: 不幸的是,即使在Java 9中也不存在。 为什么它被遗漏了? 建议的解决方法是什么? 问题答案: 为什么它被遗漏了? 该API提供了可重用的构建块。这里的相关积木是,,。通过这些,您可以实现所需的功能:将流内映射到对象,然后获得平面图。提供构建基块的排列是不切实际的,并且很难扩展。 建议的解决方法是什么? 如前所述,使用可用的构建基块(+ ):

  • 许多编译器都提供128位整数类型,但我使用过的编译器都没有提供typedefs。为什么? 据我回忆,标准 用于此目的的储量 鼓励提供此类类型的实现提供typedef 要求此类实现提供至少128位的intmax_t (而且,我不相信我使用了实际上符合最后一点的实现)