【问题标题】:Making interactive components using Java swing使用 Java swing 制作交互式组件
【发布时间】:2018-09-21 17:31:12
【问题描述】:

我正在尝试在一些服务器主机之间映射数据流。这个想法是数据在网络中的多播会话之间流动,我有一张数据来自和去往的表格。我想生成图表,显示使用箭头的去向。

我使用图形库绘制了一些形状(用于主机的矩形和用于多播会话的椭圆)并将形状的位置/比例数据存储在对象中,以便我可以计算箭头应锁定的位置。 我也在他们之间做了箭头。使用带有 paintComponenet 方法的自定义函数添加箭头,有点像 addArrow(startShape, endShape),它将找到形状的两个最近的锚点并在它们之间绘制箭头。

My work so far, randomly using the addArrow function

然而,这本身就很没有生气。我还想为箭头添加悬停效果,以便在鼠标指针触摸它时变粗并显示一些自定义文本。使用paintComponent 函数这似乎不可行,因为我无法向它绘制的形状添加事件。

我认为可以绘制箭头,然后将它们放入 JLabel 组件中并在其上定义鼠标事件。我也许还可以创建一个新的“箭头摆动组件”,但我认为这超出了我的水平。

你们有什么建议吗?

【问题讨论】:

  • 我认为你需要监听画布上的鼠标事件,然后从事件的 xy 位置计算你自己是否落在你正在绘制的任何形状的范围内。跨度>
  • 通常,当我完成此操作后,我会为每个要绘制的对象创建一个类。我给每个对象一个 draw() 方法和一个 containsPoint(x, y) 方法。然后,要绘制图像,您需要遍历对象集合,并在每个对象上调用 draw() 方法。您的对象必须知道它们的位置和状态,例如 isSelected 等...
  • 你目前的工作是一个图表 - 祝你好运继续这个图表
  • @gpasch 是的,它是一个图表,由使用图形库的代码生成,这就是重点:P 我的问题是如何将事件添加到绘制的形状中。如果您真的需要,我可以添加代码,但我觉得这不会有太大帮助,因为我相信我已经清楚地解释了问题。
  • “使用paintComponent 函数这似乎不可行” - 可以,但您需要向模型提供信息,以便它知道该怎么做。这意味着您需要使用MouseListener 和可能的MouseMotionListener。您还应该调查JComponentgetTooltipText 方法

标签: java swing user-interface shapes


【解决方案1】:

我认为可以绘制箭头,然后将它们放入 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 );

当然,这样做的问题之一是图标始终是矩形的,因此即使在箭头之外一点也会生成事件。

您可以尝试使用Playing With Icons 中的Shape Component

【讨论】:

  • 您链接的指南中的形状组件用法看起来很完美!我马上试试,谢谢! :)
猜你喜欢
  • 2012-03-12
  • 1970-01-01
  • 2011-05-13
  • 2020-03-11
  • 2016-07-05
  • 1970-01-01
  • 2013-03-29
  • 1970-01-01
  • 2017-10-21
相关资源
最近更新 更多