如何向paint方法传递值?Java新手矩形网格颜色修改问题排查
Hey there! 作为Java新手能自己折腾出矩形网格已经超棒啦,遇到改特定位置颜色的瓶颈太正常了,咱们来捋捋几个最可能的原因,帮你排查问题~
没保存矩形对象的引用,找不到目标
很多小伙伴一开始会直接在绘制方法里循环new Rectangle()然后画到画布上,画完就没下文了——这样之后想找某个位置的矩形根本找不到!你得用一个二维数组把每个矩形存起来,比如:// 先定义存储网格的二维数组 private Rectangle[][] grid; // 初始化网格时把每个矩形存到对应索引 public void initGrid(int rows, int cols) { grid = new Rectangle[rows][cols]; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { grid[i][j] = new Rectangle(x, y, width, height); // 这里填对应坐标和尺寸 grid[i][j].setColor(Color.GRAY); // 默认颜色 } } }之后改颜色时,直接通过
grid[目标行][目标列].setColor(new Color(...))就能精准操作啦。改完颜色没触发重绘,界面没更新
就算你成功改了矩形的颜色,如果没告诉Java的UI框架要重新画一遍,画布上还是会显示旧颜色!记得修改颜色后调用repaint()(Swing里),如果是JavaFX的话就调用yourPane.requestLayout()或者yourScene.getRoot().repaint(),让界面刷新成最新状态。绘制逻辑覆盖了你设置的颜色
比如你在其他地方改了颜色,但每次界面重绘时,又在paintComponent()(Swing)或者绘制方法里硬编码给所有矩形设了默认颜色,那你的修改就被覆盖了!正确的做法是绘制时读取矩形自身的颜色属性:// 错误:每次重绘都强制设成灰色 @Override protected void paintComponent(Graphics g) { super.paintComponent(g); for (int i = 0; i < grid.length; i++) { for (int j = 0; j < grid[i].length; j++) { g.setColor(Color.GRAY); // 这里会覆盖你之前改的颜色! g.fillRect(grid[i][j].x, grid[i][j].y, grid[i][j].width, grid[i][j].height); } } } // 正确:读取矩形自己的颜色 @Override protected void paintComponent(Graphics g) { super.paintComponent(g); for (int i = 0; i < grid.length; i++) { for (int j = 0; j < grid[i].length; j++) { Rectangle rect = grid[i][j]; g.setColor(rect.getColor()); // 用矩形自身的颜色 g.fillRect(rect.x, rect.y, rect.width, rect.height); } } }行列索引搞混了
数组索引是从0开始的哦!比如你想改第3行第2列的矩形,实际对应的数组索引是grid[2][1],要是搞反了或者用了从1开始的数字,就会改到错误的位置,看起来像是没生效。可以加个System.out.println("修改的位置:行" + targetRow + ",列" + targetCol),确认一下你操作的索引是不是和网格实际行列对应。
如果能把你的网格初始化、修改颜色的代码片段贴出来,我还能帮你更精准地定位问题~
内容的提问来源于stack exchange,提问作者przoch

