Создание интерактивных компонентов с использованием Java Swing - PullRequest
0 голосов
/ 21 сентября 2018

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

Я нарисовал несколько фигур (прямоугольники для узлов и овалы для многоадресных сессий), используя библиотеку Graphics, и сохранил данные положения / масштаба фигур.в объектах, чтобы я мог рассчитать, где стрелки должны зацепиться.Я также сделал стрелки между ними.Стрелки добавляются с помощью пользовательской функции с методом paintComponenet, вроде addArrow (startShape, endShape) , которая найдет две ближайшие точки привязки фигур и нарисует стрелку между ними.

Моя работа до сих пор, случайным образом используя функцию addArrow

Однако, это само по себе очень безжизненно.Я также хочу добавить эффект наведения на стрелки, чтобы он сгущался и отображал некоторый пользовательский текст, когда указатель мыши касается его.Это не представляется возможным, используя функцию paintComponent, так как я не могу добавить события к фигурам, которые она рисует.

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

У вас, ребята, есть рекомендации, как поступить?

1 Ответ

0 голосов
/ 21 сентября 2018

Я думаю, можно было бы нарисовать стрелки, а затем поместить их в компонент JLabel и определить для них события мыши.

Да.Вы просто создаете иконку для представления стрелки и затем добавляете иконку к метке.

Существует несколько способов создать иконку.

Вы можете на самом деле реализовать интерфейс Icon:

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

public class ColorIcon implements Icon
{
    private Color color;
    private int width;
    private int height;

    public ColorIcon(Color color, int width, int height)
    {
        this.color = color;
        this.width = width;
        this.height = height;
    }

    public int getIconWidth()
    {
        return width;
    }

    public int getIconHeight()
    {
        return height;
    }

    public void paintIcon(Component c, Graphics g, int x, int y)
    {
        g.setColor(color);
        g.fillRect(x, y, width, height);
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }

    public static void createAndShowGUI()
    {
        JPanel panel = new JPanel( new GridLayout(2, 2) );

        for (int i = 0; i < 4; i++)
        {
            Icon icon = new ColorIcon(Color.RED, 50, 50);
            JLabel label = new JLabel( icon );
            label.setText("" + i);
            label.setHorizontalTextPosition(JLabel.CENTER);
            label.setVerticalTextPosition(JLabel.CENTER);
            panel.add(label);
        }

        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().add(panel);
        f.setSize(200, 200);
        f.setLocationRelativeTo( null );
        f.setVisible(true);
    }
}

Или вы можете рисовать на BufferedImage и использовать изображение для создания в ImageIcon:

BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics g = bi.getGraphics();
g.setColor(...);
g.fillOval(...);
ImageIcon icon = new ImageIcon( bi );

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

Вы можете попробовать использовать Shape Component из Игра с иконками

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