边界填充(洪水填充)算法,用于构建交互式地图。JAVA

边界填充(洪水填充)算法,用于构建交互式地图。JAVA,java,swing,map,colors,flood-fill,Java,Swing,Map,Colors,Flood Fill,我正在构建一个美国交互式地图,它将响应用户对JTable的输入值。我已经这样做了,但没有洪水填充算法(每个州都有自己的.png图像)。现在我决定使用边界填充或种子填充。。。但不知怎的,它不起作用。。。以下是完整的代码: import java.awt.Color; import java.awt.Container; import java.awt.Image; import java.awt.image.BufferedImage; import javax.swing.ImageIcon;

我正在构建一个美国交互式地图,它将响应用户对JTable的输入值。我已经这样做了,但没有洪水填充算法(每个州都有自己的.png图像)。现在我决定使用边界填充或种子填充。。。但不知怎的,它不起作用。。。以下是完整的代码:

import java.awt.Color;
import java.awt.Container;
import java.awt.Image;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTable;

public class MapTest extends JFrame {


private static JTable table;
private JTable tableS;
private String[] states = {"US STATES", "Alabama",  "Alaska",   "Arizona"   };
private JLabel map;

private String[][] statesPixel = { {    "alabama",  "300",  "300"   },
        {   "alaska",   "350",  "350"   },
        {   "arizona",  "400",  "400"   },
        {   "arkansas", "450",  "450"   }   };


public MapTest() throws InterruptedException
{
    createMap();
}
private void createMap() throws InterruptedException {
Container contentPane = getContentPane();
contentPane.setBackground(Color.WHITE);
contentPane.setLayout(null);

contentPane.setSize(1220,700);

tableS = new JTable(4,1);
tableS.setBounds(1000,16,120,800);
tableS.setRowHeight(12);

int i = 0;
while (i < states.length) {
    tableS.setValueAt(states[i], i, 0);
    i++;
}

contentPane.add(tableS);


table = new JTable(4,1);
table.setBounds(1120,16,50,800);
table.setRowHeight(12);
int j = 0;
while (j < states.length) {
    table.setValueAt("100", j, 0);
    j++;
}
table.setValueAt("VALUE",0,0);
contentPane.add(table);

ExcelAdapter excelTable = new ExcelAdapter(table);

map = new JLabel();
map.setIcon(new ImageIcon("map.png"));
map.setBounds(150,50,800,600);
contentPane.add(map);

setTitle("Map");
setSize(1220,700);
setVisible(true);
setLocationRelativeTo(null);

  //updates~~
   while (true) {
    for ( int k = 0; k < statesPixel.length; k++) {
        int fill = Integer.parseInt( (String) table.getValueAt(k+1, 0));
    boundaryFill4(Integer.parseInt(statesPixel[k][1]),Integer.parseInt(statesPixel[k][2]),statesPixel[k][0],fill+1,0);
    }

}


//*******************************************************************
}

    private void boundaryFill4 (int x, int y, String state, int fill, int boundary) {

       int current;

       current = getPixel (x, y);
       if ((current != boundary) && (current != fill)) {
       setPixel (x, y, fill);
       boundaryFill4 (x+1, y, state, fill, boundary);
       boundaryFill4 (x-1, y, state,fill, boundary);
       boundaryFill4 (x, y+1, state,fill, boundary);
       boundaryFill4 (x, y-1, state,fill, boundary) ;
     }
    }

    private int getPixel(int x, int y) {
    Image img = ((ImageIcon) map.getIcon()).getImage();
    BufferedImage buffered = new BufferedImage(img.getWidth(null),img.getHeight(null), BufferedImage.TYPE_INT_ARGB);
    buffered.getGraphics().drawImage(img, 0, 0, null);
    int current = buffered.getRGB(x, y);    
    return current;
    }

    private void setPixel(int x, int y, int fill) {
    Image img = ((ImageIcon) map.getIcon()).getImage();
    BufferedImage buffered = new BufferedImage(img.getWidth(null),img.getHeight(null), BufferedImage.TYPE_INT_ARGB);
    buffered.getGraphics().drawImage(img, 0, 0, null);
    int red = fill;
    int green = red;
    int blue = red;
    Color c = new Color(buffered.getRGB(x, y));
    c = new Color(red, green, blue);
    buffered.setRGB(x, y, c.getRGB());
}

    public static void main(String args[]) throws InterruptedException {
MapTest map = new MapTest();
map.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


}

 } 
导入java.awt.Color;
导入java.awt.Container;
导入java.awt.Image;
导入java.awt.image.buffereImage;
导入javax.swing.ImageIcon;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JTable;
公共类MapTest扩展了JFrame{
私有静态JTable表;
专用JTable表;
私有字符串[]州={“美国各州”、“阿拉巴马州”、“阿拉斯加”、“亚利桑那州”};
私有JLabel映射;
私有字符串[][]statesPixel={{“alabama”、“300”、“300”},
{“阿拉斯加”、“350”、“350”},
{“亚利桑那州”、“400”、“400”},
{“阿肯色州”、“450”、“450”};
public MapTest()引发InterruptedException
{
createMap();
}
私有void createMap()引发InterruptedException{
容器contentPane=getContentPane();
contentPane.setBackground(颜色:白色);
contentPane.setLayout(null);
contentPane.setSize(1220700);
表=新的JTable(4,1);
表.立根数(1000,16120800);;
表1.设置行高(12);
int i=0;
而(i

我还使用ExcelAdapter.java,它在线提供,只是为了能够复制/粘贴到JTable。为什么我的代码不工作…我一直在调试它。。。在很长一段时间内,您的setPixel方法在新的BuffereImage(而不是实际图像)上运行,因此任何更改都会被丢弃

boundaryFill4方法还通过查看当前像素是否为黑色来检查边界,这意味着它永远不会更新地图中的任何黑色像素。此外,由于setPixel的更改被丢弃,它将永远不会完成(可能)

最后,由于你的
while(true){
没有任何终止条件,它将一直在所有图像像素上循环


此外,您的代码还需要做一些其他改进,例如,不要每次想要获取像素的颜色值时都创建一个新的BuffereImage,事实上,在最坏的情况下,切换到一个不需要堆栈大小为up width+height的算法。

您的setPixel方法在一个新的BuffereImage上运行,而不是在一个新的BuffereImage上运行实际图像,因此任何更改都将被丢弃

boundaryFill4方法还通过查看当前像素是否为黑色来检查边界,这意味着它将永远不会更新地图中的任何黑色像素。此外,由于setPixel的更改被丢弃,因此它将永远不会完成(可能)

最后,由于你的
while(true){
没有任何终止条件,它将一直在所有图像像素上循环


此外,您的代码还有一些其他改进需要改进,例如,不要在每次需要获取像素的颜色值时都创建新的BuffereImage,事实上,在最坏的情况下,切换到不需要堆栈大小为up width+height的算法。

您的代码有很多问题。实际上,据我所知,您希望为编写其他应用程序而创建一个洪水填充的测试用例。如果您熟悉python,您可能会发现以下内容很有趣—有一个现成的代码,只需复制粘贴它,然后您就可以修改它。

您的代码有很多问题。实际上,据我所知,您希望创建洪水填充的测试用例以编写一些其他应用程序。如果您熟悉python,您可能会发现