gpt4 book ai didi

java - 我试图在java中绘制正方形,但它不起作用

转载 作者:行者123 更新时间:2023-12-01 19:28:20 25 4
gpt4 key购买 nike

我正在尝试绘制正方形来制作网格系统,以在java中制作蛇游戏,但是当我运行我的代码时,我看不到任何东西。我制作了具有正方形信息(如位置)的节点类,以及具有所有正方形和 GUI 类的数据的网格类,我尝试使用 drawRect 方法,但没有结果。

import javax.swing.*;
import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.util.*;
import java.util.List;

public class SnakeGame {
public static void main(String[] args){
JFrame frame = new JFrame();
frame.setSize(300,300);
frame.setLayout(null);
Grids grids = new Grids(300);
GUI gui = new GUI(grids.nodesList,grids.nodeSize);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(gui);
frame.setVisible(true);
}
public static class Node{
public float[] position = new float[2];
public Node(float[] Position){
//this is the x position
position[0] = Position[0];
//this is the y position
position[1] = Position[1];
}
}
public static class Grids{
public int nodesNum = 6;
public float screenSize;
public float nodeSize;
public float[] startNodePos = new float[2];
public List<Node> nodesList = new ArrayList<Node>();
public Grids(float ScreenSize){
screenSize = ScreenSize;
nodeSize = screenSize / nodesNum;
//set the start node position
//x
startNodePos[0] = nodeSize /2;
//y
startNodePos[1] = nodeSize /2;
//use for loop to create nodes
for (float X = startNodePos[0] ; X <= nodeSize * 5; X += nodeSize / 2) {
for (float Y = startNodePos[1]; Y <= nodeSize * 5; Y += nodeSize / 2) {
float[] Pos = {X, Y};
Node node = new Node(Pos);
nodesList.add(node);
}
}
}
}
public static class GUI extends JPanel{
public List<Node> nodes;
public float NodeSize;
public GUI(List<Node> Nodes,float nodeSize){
nodes = Nodes;
NodeSize = nodeSize;
}

@Override
public void paintComponents(Graphics g) {
super.paintComponents(g);
for(Node node : nodes){
g.setColor(Color.BLACK);
g.drawRect((int)node.position[0],(int)node.position[1],(int)NodeSize,(int)NodeSize);
}
}
}
}

最佳答案

有两个主要错误

第一

frame.setLayout(null);

这意味着您将完全负责确定所有子组件的位置和大小。

在这种情况下,摆脱它并使用默认的 BorderLayout 可能更容易

第二个

您正在重写 paintComponents,而不是 paintComponent(不是末尾的 s)

public void paintComponents(Graphics g) {
//...
}

由于没有要绘制的组件,因此不会调用它

简单地将其更改为paintComponent(并确保您调用它的方式非常正确)

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
for (Node node : nodes) {
g.setColor(Color.BLACK);
g.drawRect((int) node.position[0], (int) node.position[1], (int) NodeSize, (int) NodeSize);
}
}

观察结果

在运行代码时,我注意到一些......有趣的事情,从长远来看,这些事情可能会给您带来问题。

  1. View 区域的大小与窗口的大小不同。窗口还需要显示嵌入到窗口中的窗口装饰(标题栏、边框等)。这会减少可用的可视区域。最好让内容提供大小调整提示并打包窗口,这让我想到...
  2. 该模型似乎正在考虑 View 属性。您的目标应该是让模型和 View 尽可能不可知,这意味着模型不应该向 View 指示显示状态。相反,单元格的大小以及扩展后的面板的大小应由 View 确定。

关于java - 我试图在java中绘制正方形,但它不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60697663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com