0

我正在尝试实现某种弹出窗口来显示给定国家/地区作者的信息,我设法做到了这一点。我加载了我的交互式地图,当我左键单击国家时,我确实收到了一条弹出消息。但是,一旦我释放按钮,弹出窗口就会消失。

我想弹出一个被吸引到那里的弹出窗口,直到我右键单击它应该消失。

所以我在实现它时遇到问题,以便在 mouseReleased() 方法中显示的弹出窗口保持绘制状态。

// Import libaries
import org.gicentre.geomap.io.*;
import org.gicentre.geomap.*;

// Instance new GeoMap
GeoMap geoMap;
PImage bgImage;

void setup()
{
  size(1280, 768);

  // Load background pattern img and implement AA for shapes
  bgImage = loadImage("bg.jpg");
  smooth();

  // New GeoMap instance
  geoMap = new GeoMap(this);

  // Load map shape
  geoMap.readFile("world");
}

void draw()
{
  // Fill ocean with bg image
  background(bgImage);

  // Change stroke color
  stroke(255, 255, 255);

  // Fill the continents color and draw the map
  fill(26, 117, 181);
  geoMap.draw();

  // Get country id by mouse location
  int countryID = geoMap.getID(mouseX, mouseY);

  // Offgrid: -1
  if (countryID != -1)
  {
    // Listen for mouse event and trigger action
    mouseReleased(countryID);
    // Color the select country
    fill(14, 96, 166);
    geoMap.draw(countryID);
  }
}

void mouseReleased(int countryID)
{
  // Act on left clicks
  if(mouseButton == LEFT)
  {
    println(getCountryName(countryID, 3));

    noStroke();
    fill(255, 192);
    rect(0, 0, width, 20);

    if (countryID != -1)
    {
      String name = getCountryName(countryID, 3);
      fill(0);
      textAlign(LEFT, CENTER);
      text(name, 0, 0, width, 20);
    }

  }
}


// Returns country name by id
String getCountryName(int id, int offset)
{
  // Get country name for query
  // getString(int id, int offset), int id: country id, int offset: 
  // Example USA
  // offset 0 = Country Code -> 257
  // offset 1 = Country Short Tag -> US
  // offset 2 = Country Short Name -> USA
  // offset 3 = Official Name -> United States
  String name = geoMap.getAttributes().getString(id, offset);

  return name;
}
4

2 回答 2

0

有一个名为 mouseReleased 的内置函数,它在处理中不带任何参数。你是故意超载吗?无论如何,这有点令人困惑。我会做这样的事情:

(伪代码)

void setup() {
 // stuff
 }

    void draw()
{

if (id != -1)
  drawPopup(id);

}

void mouseReleased() //default method called when mouse is released
 {
 if (mouseButton == LEFT)
 id = geoMap.getID(mouseX, mouseY);
}

void drawPopup(int id){
 println(getCountryName(countryID, 3));

noStroke();
fill(255, 192);
rect(0, 0, width, 20);

if (countryID != -1)
{
  String name = getCountryName(id, 3);
  fill(0);
  textAlign(LEFT, CENTER);
  text(name, 0, 0, width, 20);
}

这样在第一个之后总会有一个弹出窗口,或者您需要在适当的条件下将 id 重置为 -1 或添加 mdgeorge 建议的布尔值。但通常最好不要在鼠标函数中绘制东西。事情变得更容易控制。编辑:我应该指出还有内置的void mousePressed() 和 void mouseClicked()以及更多检查参考。

于 2012-10-30T05:22:24.993 回答
0

问题是您的绘图功能不断重复,但您仅在按下 lmb 时绘图。一旦它被释放,下一次对 draw 的调用就会覆盖你的弹出窗口。

解决这个问题的一种方法是存储一个变量(比如“shouldDraw”)来告诉你是否绘制。当按下 lmb 时,您将其设置为 true,当按下 rmb 时,您将其设置为 false。然后,您将检查 shouldDraw,而不是检查 LEFT。

我不熟悉您正在使用的框架,但可能有一个 onClick 方法或类似方法,这将是一个比 draw 更合适的地方来更改您的 shouldDraw 变量。

如果您单击然后移动鼠标,这将使标签发生变化。如果您希望保留相同的文本,则可以改为存储一个 String 并在没有可绘制的内容时将其设置为 null。

于 2012-10-28T18:08:06.300 回答