Java画布绘图

问题描述

| 编辑4:问题的新格式 背景:我有一个扩展JFrame的Window类,在JFrame中有一个画布。 我向画布添加自定义对象。该对象的唯一目的(出于争论的目的)是在画布上打印一个带有文本的圆圈。您可以将多个这些自定义组件添加到画布。当您添加新的自定义组件时,该组件与添加到画布上的先前组件相距20个像素(目前)。 问题:画布将第二个圆放置在一个称为A的位置,A大约位于表单的中心,添加的第三个圆放置在位置B,B一直位于画布的右侧,当位置A和B都向左移动了更多的圆圈。无论我在paint方法中指定为drawoval函数的x和y坐标是什么,都会发生这种情况。 问题:是否存在与您要绘制的对象有关的设置/功能/选项,例如Canvas和JFrame,它将设置在其上的对象放置在预设位置而不是指定要绘制的位置 # 在edit4之前发布的所有内容: Java中的画布是否具有我可以禁用的某种设置,从而无法将其放置在所需的位置。
public void paint(Graphics g){
  System.out.println(\"paint   X: \"+x+\"  Y: \"+y);
  g.drawoval(x,y,RAD,RAD);
  System.out.println(\"paint 2nd   X: \"+x+\"  Y: \"+y);
} 当x和y进行硬编码时,以下代码不会将两个圆放置在同一位置.out \证明x,y不变,所以我很茫然。(当两个不同的对象分别调用其draw函数时在第一个放置在预定义的位置之后而不是在我指定的位置放置一个) 编辑:我已经制作了一个jar文件,您可以检查它的意思,如果添加一个新节点,则它应该与前一个节点只有60像素,并且位置恒定。在这里能找到它 Edit2:我真的不知道您可能需要什么代码我有很多代码。就像在我有一个JFrame之前所解释的那样,在Jframe上有一个画布,为了澄清更多,我有一些对象扩展了组件,每个对象都使用上述代码片段作为paint(据我所知,当在canvas上调用repaint时会调用该对象),如果您查看该示例,则可以单击添加节点按钮,第一个对象(节点)的位置为0,0(正确),添加的第二个节点应位于添加的前一个节点右边60像素,但是您添加的第二个项目始终放置在画布的中心,无论第二个项目的坐标是什么,即使我对其进行了硬编码。如果右键单击,您还可以添加一个新节点,并且该节点应放置在您右键单击的位置,但也要添加到画布上的随机位置,我已经检查并仔细检查了该函数接收到的坐标,因此一点都没有错我的座标,这就是为什么我的问题的开始行询问如何在我绘制它们的地方(而不是在画布上想要放置它们的地方)放置要放置的物品。 Edit3:Aperantly我的问题仍然不清楚,如果您可以查看一个jar,并且已经安装了Java,则可以使用以下命令运行jar,假设jar位于命令提示符C:\\ Program Files \\ Java中的当前目录中。 \\ jre1.6.0_04 \\ bin \\ java.exe -jar Projek.jar,对于Linux,只需java -jar Projek.jar。确定以获取更多代码段。 在Window类中
public class Window extends JFrame implements   ActionListener{
...
Canvas panel;
...
private int globalX;
private int globalY;
...
public Window(){
...
graph=new Graph();

    panel = new Canvas();
panel.setLayout(new GridLayout(1,2));
...
container.add(panel);
    container.add(btn_newNode,BorderLayout.soUTH);
     addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
      });

    setSize(1024,758);
    this.setVisible(true);
}
//Add Node gets called when you click on the button
public void addNode(String name){

    int ix;
    int iy;
    String itext=name;

    if(name.compareto(\".print\") != 0){
    if(graph.VertexCount() > 0){
    Vertex temp=graph.getVertex(graph.VertexCount());

    if((temp.x + 20) < panel.getWidth() ){
        ix=temp.x + 20;
        iy=temp.y;
    }
    else{
        ix=temp.x;
        iy=temp.y + 20;
    }
    } else {
        ix=0;
        iy=0;
    }
        Vertex a=new Vertex(itext,ix,iy);
        graph.addVertex(a);
        panel.add(a);
        panel.revalidate();
      } else System.out.println(graph.toString());
    }


  public class Vertex<T> extends Component {
  private T data;
  public int x;
  public int y;
public final int RAD=50;
public Vertex( T data,int _x,int _y) {
incomingEdges = new ArrayList<Edge<T>>();
outgoingEdges = new ArrayList<Edge<T>>();
visited = false;
this.data = data;
x=_x;
y=_y;
System.out.println(\"X: \"+x+\"  Y: \"+y);

}
public void paint(Graphics g){
  System.out.println(\"paint   X: \"+x+\"  Y: \"+y);
  g.drawString(data.toString(),x+4,y+27);
  g.drawoval(x,RAD);

  //g.drawoval(20,RAD);
  System.out.println(\"paint 2nd   X: \"+x+\"  Y: \"+y);
}
我可以认为这就是一切,但是我之前错了^     

解决方法

您的Vertex组件将通过GridLayout添加到容器(画布)中。 GridLayout试图定位/绑定顶点组件。顶点绘制方法中的坐标系相对于组件的位置/边界。您正在混合两个坐标系和对象层次结构。除非您真的需要Vertex作为组件,否则我可以重新组织您的对象结构。如果确实需要Vertex作为组件,则需要使用NO布局管理器(或自定义管理器),并使用Vertex对象的Component坐标进行渲染。根据您的要求,解决方案非常不同。     ,drawOval的方法签名为:
public abstract void drawOval(int x,int y,int width,int height)
结果是一个圆形或椭圆形,适合x,y,width和height参数指定的矩形。 x和y位置相对于画布,而不是椭圆的中心。它们代表椭圆形左上角的位置。 宽度和高度相同时,它们是圆的直径,而不是半径。 编辑以响应问题的更改。 我们中有些人无法访问网络文件存储。我们正在工作,并且防火墙不允许我们访问。即使我们可以访问它,下载一个jar,解压缩jar并打开IDE来查看您正在做什么也很麻烦。如果需要我们的帮助,您需要付出一些努力来提出问题。 调用
drawOval
方法会根据传递的参数绘制一个椭圆形。如果椭圆形不在画布上的正确位置,则参数错误。 最后,为了将来其他人的利益。如果要绘制一个圆,并且有一个中心点x,y和半径RAD,则以下方法调用将绘制您期望的圆。
g.drawOval(x - RAD,y - RAD,RAD + RAD,RAD + RAD);