我正在构建一个美国互动地图,该地图将响应用户对JTable的输入值。我已经这样做了,但没有填充算法(每个州都有自己的.png图像)。现在,我已经决定使用边界填充或种子饱满......但它不以某种方式工作...以下是完整的代码:边界填充(洪水填充)算法构造交互式地图。 Java
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);
}
}
我也用ExcelAdapter.java,可以在网上刚启用复制/粘贴到JTable。为什么我的代码不能正常工作......我一直在调试它......很长一段时间
您正在使用递归洪水填充算法,这对于大型图像肯定会失败。 Scanline算法在这里最适合。查看*** [this](http://en.wikipedia.org/wiki/Flood_fill)***页面获取更多信息。该算法的实现可以发现*** [这里](http://stackoverflow.com/questions/14672861/how-to-add-mouseclicked-to-script/14673438#14673438)*** – 2013-04-08 02:46:54
@Extreme我熟悉扫描线算法,但是,我的问题是:程序甚至没有显示任何更改,它是如果它忽略我的代码...图像会加载,但没有颜色变化发生在所有...但我没有得到任何错误... – Buras 2013-04-08 02:54:16
@Extreme Coders ExcelAdapter没有问题。我把它作为一个单独的课程。它完美的作品。我已经检查了100%,系统输出等...我有这样的代码写在ExcelAdapter不同的方式... – Buras 2013-04-08 03:01:20