Создание ярлыков вместе с Drawlines - PullRequest
1 голос
/ 22 марта 2011

Я задал вопрос, касающийся пользовательского виджета, но не понял, нужен ли он мне и как действовать.

У меня есть этот класс

public class GUIEdge {

   public Node node1;
   public Node node2;
   public int weight;
   public Color color;
    public GUIEdge(Node node1, Node node2 , int cost) {
       this.node1 = node1;
       this.node2 = node2;
       this.weight = cost;
       this.color = Color.darkGray;
    }

    public void draw(Graphics g) {
        Point p1 = node1.getLocation();
        Point p2 = node2.getLocation();
        g.setColor(this.color);
        ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        g.drawLine(p1.x, p1.y, p2.x, p2.y);

    }
}

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

Я уже добавил обработку для перетаскивания узлов и ребер, так что как лучше создать метку

Нужно ли для этого создавать собственный виджет? Может ли кто-нибудь объяснить, что если создать компонент путем расширения из JComponent, тогда я назову его g.mixed (), где смешан этот новый виджет ...?

Ответы [ 2 ]

2 голосов
/ 22 марта 2011

Полезные советы, безусловно, стоит посмотреть. Другие варианты включают drawString(), translate() или TextLayout. Существует множество примеров .

Приложение: В приведенном ниже примере показаны drawString() и setToolTipText(), как предложено @Catalina Island. Для simplicity конечные точки относятся к размеру компонента, поэтому вы можете увидеть результат изменения размера окна.

Добавление: использование setToolTipText() просто демонстрирует подход. Как отмечает @camickr здесь , вы должны переопределить getToolTipText(MouseEvent) и обновить подсказку, когда мышь находится над линией или когда линия выделена.

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Point;
import javax.swing.JComponent;
import javax.swing.JFrame;

/** @see https://stackoverflow.com/questions/5394364 */
public class LabeledEdge extends JComponent {

    private static final int N = 20;
    private Point n1, n2;

    public LabeledEdge(int w, int h) {
        this.setPreferredSize(new Dimension(w, h));
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        this.n1 = new Point(N, N);
        this.n2 = new Point(getWidth() - N, getHeight() - N);
        g.drawLine(n1.x, n1.y, n2.x, n2.y);
        double d = n1.distance(n2);
        this.setToolTipText(String.valueOf(d));
        g.drawString(String.valueOf((int) d),
            (n1.x + n2.x) / 2, (n1.y + n2.y) / 2);
    }

    private static void display() {
        JFrame f = new JFrame("EdgeLabel");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new LabeledEdge(320, 240));
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                display();
            }
        });
    }
}
1 голос
/ 22 марта 2011

Я думаю, вы можете использовать GUIEdge extends JComponent.Таким образом, вы автоматически получите метки подсказок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...