2013-04-12 2 views
0

У меня проблема, которую я не могу исправить с помощью кода Java.drawLine component with setBounds

Я создал программу, которая отображает карту, когда вы нажимаете на карту, u получаю краф/узел, пунктирный на карте. Когда я соединяю два узла друг с другом, должна быть показана строка между связанными точками.

До сих пор так хорошо, или я так думал, но ... Это нормально, когда x1,y1 координаты имеют значения, которые меньше, чем x2,y2 ...

Я понял, что это SetBounds, что было пугая я ... Но я не знаю, как решить свою проблему, и я не могу найти какой-либо симулятивной проблемы где-нибудь вокруг ... Кто-нибудь сталкивался с такой проблемой, и если да, то как вы это решили?

import java.awt.*; 
import javax.swing.*; 

public class DrawMyLine extends JComponent{ 
    private int fx, fy, tx, ty; 
    private int h,w; 
    private int m; 
    private double k; 
    private Destinations from; 
    private Destinations to; 

public DrawMyLine(Destinations from, Destinations to){ 
    this.from=from; 
    this.to=to; 
    setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); 

    fx = from.getX(); 
    fy = from.getY(); 
    tx = to.getX(); 
    ty = to.getY(); 


    //w = Math.abs(tx - fx); 
    //h = Math.abs(ty - fy); 
    w = tx - fx; 
    h = ty - fy; 

    int x,y; 

    if(ty>fy){ //This is my, not so great solution so far... 
     x = fx; 
     y = fy; 
    } 
    else{ 
     x = tx; 
     y = ty; 
    } 

    setBounds(x+5,y+5, w, h); //How do I reverse the boundary? 
    setPreferredSize(new Dimension(w, h)); 
    setMinimumSize(new Dimension(w, h)); 
    setMaximumSize(new Dimension(w, h)); 
    } 

//@Override 
protected void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     g.setColor(Color.BLACK); 
     g.drawLine(0,0,w,h); 
} 

//Method to reduce the clickable area to 5 pixels from the line 
public boolean contains(int x, int y){ 

    k = ((ty-fy)/(tx-fx)); 
    if(k >= 0){ 
     m = 0; 
    } 
    else{ 
     m = ty - fy; 
    } 
    return Math.abs(y - k * x - m) < 5; 
}//contains 

public Destinations getFrom(){ 
    return from; 
} 
public Destinations getTo(){ 
    return to; 
} 

} 

И в основном (когда два узла соединены):

DrawMyLine dml = new DrawMyLine(from,to); 
panel.add(dml); 
panel.repaint(); 
dml.addMouseListener(lineListener); 

Может кто-нибудь мне помочь? Пожалуйста!

+0

Не меняйте границы, переверните линию ... – MadProgrammer

ответ

1

Не меняйте границы, переверните рендеринг.

Подумайте об этом ...

enter image description here enter image description here

В изображениях выше, единственное, что изменилось, так это начальные и конечные точки. Размер прямоугольника не изменился.

Все границы должны работать с положительными значениями. В Swing нет такой вещи, как прямоугольник с отрицательным размером.

Теперь мои примеры были оказаны с использованием java.awt.Point, но основная концепция остается ...

// Find the smallest point between the two 
int x = Math.min(p1.x, p2.x); 
int y = Math.min(p1.y, p2.y); 
// Size is based on the maximum value of the two points differences... 
int width = Math.max(p1.x - p2.x, p2.x - p1.x); 
int height = Math.max(p1.y - p2.y, p2.y - p1.y); 

Это теперь дает вам размер области эффекта. Рисование линии - это всего лишь вопрос рисования линии между двумя точками (а не 0, 0, width, height, которую вы использовали)

+0

Thx, посмотрим на это скоро .. – Conjak

0

ОК, я думаю, что понимаю логику, но когда я тестирую свою программу, это похоже на линию get за границами.

import java.awt.*; 
import javax.swing.*; 

public class DrawMyLine extends JComponent{ 
    private int fx, fy, tx, ty; 
    private int h,w; 
    private int m; 
    private double k; 
    private Destinations from; 
    private Destinations to; 

    public DrawMyLine(Destinations from, Destinations to){ 
    this.from=from; 
    this.to=to; 
    setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); 

    fx = from.getX(); 
    fy = from.getY(); 
    tx = to.getX(); 
    ty = to.getY(); 


    // Find the smallest point between the two 
    x1 = Math.min(fx, tx); 
    y1 = Math.min(fy, fy); 
    // Size is based on the maximum value of the two points differences... 
    int w = Math.max(fx - tx, tx - fx); 
    int h = Math.max(fy - ty, ty - fy); 

    setBounds(x1,y1, w, h); 
    setPreferredSize(new Dimension(w, h)); 
    setMinimumSize(new Dimension(w, h)); 
    setMaximumSize(new Dimension(w, h)); 
} 

//Method to reduce the clickable area to 5 pixels from the line 
public boolean contains(int x, int y){ 

    k = ((ty-fy)/(tx-fx)); 
    if(k >= 0){ 
     m = 0; 
    } 
    else{ 
     m = ty - fy; 
    } 
    return Math.abs(y - k * x - m) < 5; 
}//contains 

//@Override 
protected void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    g.setColor(Color.BLACK); 

    if(fx<tx || fy<ty){ // Something like this? 
    g.drawLine(fx,fy,tx,ty); 
    } 
    else{ 
    g.drawLine(tx,ty,fx,fy); 
    } 
} 

public Destinations getFrom(){ 
return from; 
} 
public Destinations getTo(){ 
return to; 
} 

} 

показывает некоторые линии, всего мелкие кусочки ... Смотрите рис ...

http://imgur.com/Ue9VtEL

Почему это так?

+0

Хорошо, решил это .. – Conjak