Java Swing中的交互式组件

时间:2011-03-30 04:22:20

标签: java swing

我需要在Java Swing中实现一个映射,它与空间数据库连接以处理一些查询。我使用jLabel来表示地图图像。

我需要拖动一个区域并返回该区域内的所有可能元素。每个返回元素应在地图上显示为黄色三角形或红色圆圈,并且可以单击这些多边形以提供有关其他位置的更多信息。

这是我的困惑。我应该使用哪个组件来演示图像上的元素? 它需要具有交互性才能直观地选择JButton,这是我的实现:

    Iterator<JGeometry> it = al.iterator();
    while (it.hasNext()) {
        JButton jButton1 = new JButton();
        jButton1.setText("213");
        jButton1.setBounds(325 + (int)it.next().getPoint()[0], 70 + (int)it.next().getPoint()[1], 30,30);
        jButton1.setVisible(true);
        getContentPane().add(jButton1);
    }

但它没有在面板上显示任何按钮。我认为包含图像的jButton和jLabel都处于同一级别,因此可能存在一些重叠。我该怎么处理?对于这种情况有没有更好的解决方案?

expected performance

3 个答案:

答案 0 :(得分:2)

考虑在监听鼠标事件的JPanel上绘制这些元素。用户将单击并拖动,创建一个有界框,您可以确定是否有任何对象相交,并获得它们的坐标。

这是一个可以帮助您入门的demo

答案 1 :(得分:1)

GraphPanel显示了一种通过点击和拖动进行多项选择的方法。

答案 2 :(得分:1)

这与您的问题没有直接关系,但您的代码中还有另一个问题会给您带来麻烦。

你在循环中调用it.next()两次。每次调用next()都会将迭代器移动一个元素,因此您获得的第一个对象将与第二个对象不同。因此,您的结果不仅会出错,而且如果al中的元素数量为奇数(因为您一次取两个元素),您最终会遇到异常。相反,您应该只调用next()一次并将值赋给局部变量,或者使用Java 6 for循环语法:

for(JGeometry geom : al) {
    ...
    jButton1.setBounds(325 + (int)geom.getPoint()[0], 70 + (int)geom.getPoint()[1], 30, 30);
    ...
}