2012-10-17 90 views
1

我正在嘗試使用一些Piccolo來創建可縮放界面。Piccolo可縮放界面,如何在縮放時更改文字

我在畫布上用一些PText創建了一個矩形。現在,在縮放時,我想將文本更改爲不同的內容。

我在我的初始化做到了這一點:

// 
     //specify the current Piccolo PCanvas 
     // 
     m_canvas = getCanvas(); 
     m_canvas.removeInputEventListener(m_canvas.getPanEventHandler()); 
     //m_canvas.addInputEventListener(new ClickAndDragHandler(m_canvas)); 

     // 
     //add nodes to the collection -> adding to the collection = adding to the canvas 
     // 
     m_nodecollection = new NodeCollection(m_canvas); 

     RectangleNode node_links = new RectangleNode(); 
     node_links.setBounds(10, 10, 500, 500); 
     m_nodecollection.addNode(node_links); 

     RectangleNode node_rechts = new RectangleNode(); 
     node_rechts.setBounds(600,10,500,500); 
     m_nodecollection.addNode(node_rechts); 

     PImage node_arrowLeft = new PImage("left.gif"); 
     node_arrowLeft.setBounds(600, 550, node_arrowLeft.getWidth(), node_arrowLeft.getHeight()); 
     m_nodecollection.addNode(node_arrowLeft); 

     PImage node_arrowRight = new PImage("right.gif"); 
     node_arrowRight.setBounds(680, 550, node_arrowRight.getWidth(), node_arrowRight.getHeight()); 
     m_nodecollection.addNode(node_arrowRight); 

     m_nodecollection.connectNodesWithLine(node_rechts, node_arrowRight, true); 
     m_nodecollection.connectNodesWithLine(node_rechts, node_arrowLeft, true); 


     PText node_text = new PText("Zoomlevel Not Supported"); 
     node_text.setBounds(180,150, node_text.getWidth(), node_text.getHeight()); 
     m_nodecollection.connectNodesWithLine(node_links, node_text, true); 
     m_nodecollection.addNode(node_text); 
     node_links.addChild(node_text); 
     node_links.setCollection(m_nodecollection); 

創建了自己的類矩形與整個nodecollection和PText爲membervar。

public class RectangleNode extends PNode{ 

    private Rectangle2D m_rectangle; 
    private NodeCollection collection; 
private PText text; 

    public RectangleNode() 
    { 
     m_rectangle = new Rectangle2D.Double(); 
    } 

    public Rectangle2D getRectangle() 
    { 
     if(m_rectangle == null) 
      m_rectangle = new Rectangle2D.Double(); 
     return m_rectangle; 
    } 

    public boolean setBounds(double x, double y, double w, double h) 
    { 
     if(super.setBounds(x, y, w, h)) 
     { 
      m_rectangle.setFrame(x, y, w, h); 
      return true; 
     } 
     return false; 
    } 

    public void setCollection(NodeCollection collection) 
    { 
     this.collection = collection; 
    } 
     public void setText(PText text) 
{ 
    this.text = text; 
} 
    public void paint(PPaintContext paintcontext) 
    { 
     Graphics2D g2 = paintcontext.getGraphics(); 

     //niet ingezoomd 
     if(paintcontext.getScale() <= 0.2) 
      g2.setPaint(Color.BLACK); 

     //half ingezoomd 
     if(paintcontext.getScale() > 0.2 && paintcontext.getScale() < 0.7) 
     { 

      g2.setPaint(Color.BLACK); 

     } 

     //volledig ingezoomd 
     if(paintcontext.getScale() > 0.7) 
     { 
      g2.setPaint(Color.RED); 
      g2.fill(getRectangle()); 
      g2.setPaint(Color.BLACK); 
      g2.draw(getRectangle()); 
     } 
    } 
} 

現在,我想我可以像這樣改變文本:text.setText(「Tester」);但它不起作用,當例如settext,然後將節點添加到集合然後它顯示在當前的文本與一個巨大的錯誤...

有人可以幫我嗎?

親切的問候,

回答

1

考慮張貼整個例如作爲SSCCE,貌似代碼的某些部分丟失。目前還不清楚你如何實際執行setText

構建現有節點並偵聽從攝像頭髮起的事件可能更容易。考慮下面的例子,繪製一個矩形用一些文字,其被按照縮放級別更新:

import java.awt.Color; 
import java.beans.PropertyChangeEvent; 
import java.beans.PropertyChangeListener; 

import edu.umd.cs.piccolo.PCamera; 
import edu.umd.cs.piccolo.nodes.PPath; 
import edu.umd.cs.piccolo.nodes.PText; 
import edu.umd.cs.piccolo.util.PPaintContext; 
import edu.umd.cs.piccolox.PFrame; 

public class TestRectZoom extends PFrame { 
    public TestRectZoom() { 
     super("TestRectZoom", false, null); 
    } 

    public void initialize() { 
     getCanvas().setInteractingRenderQuality(
       PPaintContext.HIGH_QUALITY_RENDERING); 
     getCanvas().setDefaultRenderQuality(
       PPaintContext.HIGH_QUALITY_RENDERING); 
     getCanvas().setAnimatingRenderQuality(
       PPaintContext.HIGH_QUALITY_RENDERING); 

     final PPath rect = PPath.createRectangle(100, 100, 200, 200); 
     rect.setPaint(Color.GREEN); 
     getCanvas().getLayer().addChild(rect); 

     final PText text = new PText(getZoomLevelString()); 
     rect.addChild(text); 

     text.centerFullBoundsOnPoint(rect.getBounds().getCenterX(), rect 
       .getBounds().getCenterY()); 

     getCanvas().getCamera().addPropertyChangeListener(
       PCamera.PROPERTY_VIEW_TRANSFORM, new PropertyChangeListener() { 
        public void propertyChange(final PropertyChangeEvent evt) { 
         text.setText(getZoomLevelString()); 

         if (getCanvas().getCamera().getViewScale() > 0.9) { 
          rect.setPaint(Color.GREEN); 
         } else { 
          rect.setPaint(Color.RED); 
         } 
        } 
       }); 
    } 

    private String getZoomLevelString() { 
     return "Zoom level:" 
       + String.format("%.2f", getCanvas().getCamera().getViewScale()); 
    } 

    public static void main(final String[] args) { 
     new TestRectZoom(); 
    } 
} 

這就是結果的樣子:

enter image description hereenter image description here

0

我解決了這個問題就像水上建議。

相關問題