Java Canvas Drawing - PullRequest
       12

Java Canvas Drawing

1 голос
/ 24 мая 2011

Редактировать 4: Новое форматирование вопроса

. ПРЕДПОСЫЛКИ: У меня есть класс Window, который расширяет JFrame. В JFrame у меня есть холст.На холст я добавляю нестандартные объекты.Единственная цель этого объекта (ради аргументации) - напечатать круг с текстом на холсте.Вы можете добавить несколько таких пользовательских компонентов на холст.Когда вы добавляете новый пользовательский компонент, он помещается на 20 пикселей (на данный момент) от предыдущего компонента, добавленного на холст.

ПРОБЛЕМА: холст помещает второй круг в положение, позволяющее назвать его A, Aприблизительно в центре формы. Третий добавленный круг помещается в позицию B, B находится полностью справа от холста, когда добавляется больше кругов, обе позиции A и B сдвигаются влево.Это происходит независимо от того, что я указываю в качестве координат x и y функции drawOval в методе рисования.

ВОПРОС: Есть ли параметр / функция / параметр, относящийся к объектам, которые вы рисуете, например, 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 не меняются, поэтому я в растерянности. (когда два разных объекта вызывают свою функцию рисования каждый после того, как первый находится в предопределенных позициях, но не там, где я его указываю)

Редактировать: я сделалJAR-файл, который вы можете проверить, чтобы понять, что я имею в виду, если вы добавляете новый узел, он должен быть только на расстоянии 60 пикселей от предыдущего, и с постоянной позиция.Его можно найти здесь

Edit2: Я действительно не знаю, какой код вам может понадобиться, у меня действительно много кода.Как объяснено до того, как у меня есть JFrame, на Jframe есть холст, чтобы прояснить больше, у меня есть объекты, которые расширяют компонент, каждый из которых использует приведенный выше фрагмент кода в качестве краски (который, насколько я понимаю, вызывается, когда repaint вызывается на холсте) если вы посмотрите на пример, вы можете нажать кнопку «Добавить узел», первый объект (узел) будет помещен в 0,0, что правильно, второй добавленный узел должен быть помещен в 60 пикселях справа от предыдущего добавленного узла,но второй, который вы добавляете, всегда помещается в центре холста, независимо от того, каковы координаты этого второго элемента, даже если я жестко их кодирую.Если вы щелкнете правой кнопкой мыши, вы также можете добавить новый узел, и этот узел должен быть размещен там, где вы щелкнули правой кнопкой мыши, но также будет добавлен в случайную позицию на холсте, который я проверил, и дважды проверьте координаты, которые получает функция, чтобы ничего не случилосьмои координаты, вот почему в стартовой строке моего вопроса спрашивается, как расположить Предметы, где я их рисую, а не там, где холст хочет их разместить.

Edit3: в действительности мой вопрос все еще неясен, есливы можете посмотреть 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, y, RAD , RAD);

  //g.drawOval(20, 0, RAD , RAD);
  System.out.println("paint 2nd   X: "+x+"  Y: "+y);
}

Это все, что я могу считать относящимся к делу, но я ошибался до ^ ^ 1029 *

Ответы [ 2 ]

4 голосов
/ 24 мая 2011

Подпись метода для drawOval :

public abstract void drawOval(int x,
                              int y,
                              int width,
                              int height)

Результатом является круг или эллипс, который вписывается в прямоугольник, заданный аргументами x, y, width и height.

Положение x и y относительно холста и не центр овала. Они представляют позицию слева вверху от овала.

Ширина и высота, когда они совпадают, являются диаметром круга, а не радиусом.

Отредактировано для ответа на изменения в вопросе.

Некоторые из нас не могут получить доступ к хранилищу веб-файлов. Мы на работе, и наши брандмауэры не позволяют нам доступ. Даже если бы мы могли получить к нему доступ, было бы очень сложно скачать банку, распаковать банку и открыть IDE, чтобы увидеть, что вы делаете. Если вам нужна наша помощь, вам нужно приложить некоторые усилия, чтобы задать вопрос.

Вызов метода drawOval рисует овал на основе переданных параметров. Если овал не в правильном месте на холсте, то параметры неверны.

Наконец, в интересах других, которые встретят этот ответ в будущем. Если вы хотите нарисовать круг, и у вас есть центральная точка x, y и радиус RAD, то следующий вызов метода нарисует ожидаемый круг.

g.drawOval(x - RAD, y - RAD, RAD + RAD, RAD + RAD);
1 голос
/ 24 мая 2011

Ваши компоненты Vertex добавляются в контейнер (Canvas) с помощью GridLayout. GridLayout пытается расположить / связать компоненты Vertex. Система координат в методе рисования Вершины относится к положению / границам компонента. Вы смешиваете две системы координат и иерархии объектов. Если вам ДЕЙСТВИТЕЛЬНО не нужна вершина, чтобы быть компонентом , я мог бы реорганизовать структуру вашего объекта. Если вам НЕОБХОДИМО, чтобы Vertex был компонентом, тогда вам нужно использовать NO менеджер раскладки (или собственный менеджер) и использовать координаты Компонента для объектов Vertex для рендеринга. Решение очень разное в зависимости от ваших требований.

...