【问题标题】:Rectangle creation in JFrame shifting right for no discernible reasonJFrame 中的矩形创建无缘无故右移
【发布时间】:2017-05-16 04:02:13
【问题描述】:

我正在尝试使用 2D 数组为 JFrame 着色以创建网格,用于学校项目的“地图”。 问题是,在帧的 (0,0) 位置,会出现一个随机的灰色框,将所有内容推到右侧。它甚至将最后一个块推到 NEXT 行的第一个位置,这让我非常困惑。

我考虑到数组以索引“0”开头的事实,我想知道为什么它没有在 (0,0) 位置绘制一个黑框。

这是我的代码中的两个相关类:

public class Floor1Components extends JComponent {
  public void paintComponent(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;

    for (int y = 0; y < Map.floor1Schematics.length; y++) { //for every row

        for(int x = 0; x < Map.floor1Schematics[0].length; x++) {   //do something for every column
            Rectangle block = new Rectangle((x*50), (y*50), 50, 50);
            g2.draw(block);
            g2.fill(block);
            if(Map.floor1Schematics[y][x].equals("wl")) {
                g2.setColor(Color.BLACK);
            }
            if(Map.floor1Schematics[y][x].equals("gr")) {
                g2.setColor(Color.GREEN);
            }
            if(Map.floor1Schematics[y][x].equals("end")) {
                g2.setColor(Color.RED);
            }
            if(Map.floor1Schematics[y][x].equals("ch")) {
                g2.setColor(Color.YELLOW);
            }
            if(Map.floor1Schematics[y][x].equals("pv")) {
                g2.setColor(Color.GRAY);
            }
        }

    }   
}

}

public class Map {

public static boolean floor1 = true;
public static boolean floor2 = false;
public static boolean floor3 = false;

public static JFrame frame = new JFrame();

public static String floor1Schematics[][] = 
    {
{"wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl"},
{"wl","gr","gr","gr","wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl","gr","gr","gr","wl"},
{"wl","gr","ch","gr","wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl","gr","ch","gr","wl"},
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"},
{"wl","wl","wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl","wl","wl"},
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"},
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"},
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"},
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"},
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"},
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"},
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"},
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","pv","pv","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"},
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","pv","pv","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"},
{"wl","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","wl"},
{"wl","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","wl"},
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","pv","pv","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"},
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","pv","pv","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"},
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"},
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"},
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"},
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"},
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"},
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"},
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"},
{"wl","wl","wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl","wl","wl"},
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"},
{"wl","gr","ch","gr","wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl","gr","ch","gr","wl"},
{"wl","gr","gr","gr","wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl","gr","gr","gr","wl"},
{"wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl"},

    };

public static void createFrame() {

    frame.setSize(1600,1600);
    frame.setTitle("Frame");
    frame.setResizable(false);
    //frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    //PlayerModel player = new PlayerModel();
    //frame.add(player);
    //frame.setVisible(true);
    if (floor1 && !floor2 && !floor3) {
        Floor1Components floor1 = new Floor1Components();
        frame.add(floor1);
        frame.setVisible(true);
    }
}

public static void main(String[] args) {
    createFrame();
}

}

为 2D 阵列的暴行道歉,这是为了着色和检测你站在什么块上。但我很困惑为什么所有东西都被推到右边,然后再往下。我已经研究了一千次块创建和索引引用的数学。

【问题讨论】:

  • 您是否尝试在绘制/填充矩形之前设置颜色
  • 是的,这行得通。非常感谢!

标签: java arrays swing jframe


【解决方案1】:

我觉得你应该放

        g2.draw(block);
        g2.fill(block);

如果我没记错的话,在你的 setcolors 之后。

对于第一个元素,您正在绘制一个框,然后设置颜色。让我知道这是否有帮助。如果你有main方法代码,我愿意进一步帮助。

【讨论】:

  • 天哪。谢谢你。我已经为这个错误工作了一周,甚至围绕它进行了硬编码,这给我带来了更多的问题,而这一切都是因为这个。你能向我解释为什么这有效吗?我不想再犯同样的错误。非常感谢。
  • 据我所知,它有点像这样(例如,使用现实世界的物品):默认情况下,您会拿起一支灰色铅笔。如果你想画一些东西,它会把它画成灰色。你需要选择你想用的正确的彩色铅笔,然后画出你需要的东西。不太确定它为什么会被偏移,但这需要使用实际代码进行更多调试。此外,您可能不需要 g2.draw,只需 g2.fill。
  • 从我所看到的情况来看,偏移量似乎来自 for 循环的工作方式。
  • 如果它有助于解决问题,请accept the answer
猜你喜欢
  • 2022-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-14
  • 2021-02-09
  • 2017-04-11
  • 1970-01-01
相关资源
最近更新 更多