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

Processing でパラメーターをとらない、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 の呼び出しでポップアップが描画されます。

これを解決する 1 つの方法は、描画するかどうかを示す変数 ("shouldDraw" など) を格納することです。lmb が押されたときはこれを true に設定し、rmb が押されたときは false に設定します。次に、LEFT をチェックする代わりに、shouldDraw をチェックします。

私はあなたが使用しているフレームワークに精通していませんが、onClick メソッドなどがあるかもしれません。これは、shouldDraw 変数を変更するための draw よりも適切な場所です。

これにより、クリックしてからマウスを動かすと、ラベルが変更されます。同じテキストを残したい場合は、代わりに文字列を保存し、描画するものが何もないときにそれを null に設定できます。

于 2012-10-28T18:08:06.300 に答える