以下のようなコードスニペットがあります
:
Graphics g; // Java Graphics class
g.drawString("text", x, y); // x, y for coordinate info, "text" is now an image object
:
Graphics インスタンスから「テキスト」を文字列に戻すことはできますか?
テーブルからデータを取得するためのキーとして文字列データを使用したいので。
最善の方法は、おそらくテキストをString
変数に格納し、代わりにそこから取得することです。
プレゼンテーション層とモデル層で生成されるノード インスタンスの X 座標と Y 座標をそれぞれ記憶する 2 つのテーブルを追加することで、この問題を解決しました。
実行時に、ノード イメージはその位置を変更し続け、これらのイベントはすべて更新されます。
Panel インスタンスのノード イメージをクリックすると、ノード インスタンスの ID が表示されます。
2 つのテーブルが必要な理由は、ノード イメージの X、Y 位置を呼び出して返された id が同じノード オブジェクトを参照している場合にのみ、イベントがクリックされたノード イメージによって表されるノード オブジェクトに対するものであるという証拠になるためです。これで、マルチキー テーブルを使用できたことがわかりました。
import java.util.ArrayList;
import java.util.List;
// * Represents node at presentation layer and its model
public class NodeObject
{
// * node id
private int id;
// * coordinate on Panel
public double x;
public double y;
// * coordinate change
private double dx;
private double dy;
// * isFixed
public boolean fixed;
// * node name
public String nodeName;
// * connected node object id list ( redundant when edge is used )
public List<Integer> connectedNodeIdList;
// * connected edge object id list
private List<Integer> connectedEdgeIdList;
// * constructor
public NodeObject()
{}
// * constructor
public NodeObject( int _id )
{
// * initialization
this.id = _id;
// * default
this.nodeName = "default";
// * connected node id list
this.connectedNodeIdList = new ArrayList<Integer>();
}
// * Constructor ( when node name is given )
public NodeObject( int _id, String _nodeName )
{
// * node id
this.id = _id;
// * node name
this.nodeName = _nodeName;
// * connected node id list
this.connectedNodeIdList = new ArrayList<Integer>();
// * connected edge id list
this.connectedEdgeIdList = new ArrayList<Integer>();
}
// * set node name
public void setNodeName( String nName )
{
this.nodeName = nName;
}
// * get node id
public int getNodeId()
{
return this.id;
}
// * get node name
public String getNodeName()
{
return this.nodeName;
}
// * get node name and id in String
public String getNodeNameWithID()
{
String id = Integer.toString( this.getNodeId() );
return ( this.nodeName + "-" +id );
}
// * store connected node
public boolean addSingleNode( int nid )
{
if ( this.connectedNodeIdList.contains( nid ) == true )
{
return true; // this node is already connected
}
else
{
// * register
this.connectedNodeIdList.add( nid );
// * this is the first time this node is connected
return false;
}
}
// * unregister a node
public boolean removeConnectedSingleNode( int nid )
{
// * it was registered before
if ( this.connectedNodeIdList.contains( nid ) == true )
{
this.connectedNodeIdList.remove( nid );
return true; // it had been registered and now unregistered ( only at model layer )
}
else
{
return false; // it has not been registered before.
}
}
// * add edge id
public boolean addSingleEdge( int eid )
{
if ( this.connectedEdgeIdList.contains( eid ) == true )
{
return true; // already registered edge
}
else
{
// * registered
this.connectedEdgeIdList.add( eid );
// * this is the first time this edge was connected
return false;
}
}
// * remove edge
public boolean removeConnectedSingleEdge( int eid )
{
// * registered before
if ( this.connectedEdgeIdList.contains( eid ) == true )
{
this.connectedEdgeIdList.remove( eid );
return true; // now removed ( model level )
}
else
{
return false; // it has not been registered before
}
}
// * return edge id list
public List<Integer> getEdgeIdList()
{
return this.connectedEdgeIdList;
}
//////// for visualization on Panel instance ///////
// * X coordinate setting
public void setNodePositionX( Double xPos )
{
this.x = xPos;
}
// * Y coordinate setting
public void setNodePositionY( Double yPos )
{
this.y = yPos;
}
// * change of node position
public void changeNodePosition( Double changeX, Double changeY )
{
this.x = this.x + changeX;
this.y = this.y + changeY;
}
// * position difference
public void changeNodePositionDifference( Double changeDX, Double changeDY )
{
this.dx = this.dx + changeDX;
this.dy = this.dy + changeDY;
}
// * update node position difference
public void updateNodePositionDifference( Double changeDX, Double changeDY )
{
this.dx = changeDX;
this.dy = changeDY;
}
// * get X pos
public double getNodePositionX()
{
return this.x;
}
// * get Y pos
public double getNodePositionY()
{
return this.y;
}
// * get dx
public double getNodePositionDX()
{
return this.dx;
}
// * get dy
public double getNodePositionDY()
{
return this.dy;
}
}
そしてGraphクラスは以下のようになります
public class Graph extends Panel implements Runnable, MouseListener, MouseMotionListener, ItemListener
{
// * number of nodes
public int nnodes;
// * node generator
public NodeGenerator ndGenerator;
// * memorize the node coordinate
public Map<Integer, Integer> xCoordinateTbl; // key : coordinate / value : node id
public Map<Integer, Integer> yCoordinateTbl;
// * node tbl
public Map<Integer, NodeObject> nodeTbl;
マウスクリックイベントが発生すると、以下のように処理されます
public void actionPerformed(ActionEvent event)
{
// * get node id of the node object being referred to at the presentation layer
Integer nid = getNodeId( e.getPoint().x, e.getPoint().y );
// * remove node on the presentation layer and of the model at the same time
removeSingleNode( nid );
}
いいえ、Graphics
インスタンスは画面上のテキストまたは画像をピクセルとして描画するだけです。あなたが描いたテキストが何であるかを覚えていないので、あなたに伝えることはできません.
プログラム内で別の方法でテキストを保存する必要があります。これにより、後で必要な目的 (テーブルからデータを取得するなど) でテキストを取得できます。