【发布时间】:2014-02-01 15:50:25
【问题描述】:
我有一个 JLayeredPane。我在上面放置了几个组件。这些组件是扩展 jPanel 的类。所有组件都放置在相同的深度层中。每个组件可能完全/部分在其上方/下方具有或不具有其他组件。当我单击组件时,单击了最上面的组件。
如何检查在我点击的最顶层下方是否有更多组件?如何将点击事件“传递”给其中一个或下面的许多组件?
编辑:一个工作示例
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import javax.swing.*;
public class JavaJLayeredPane {
JFrame frame;
JLayeredPane layeredPane;
JPanel Panel1;
JPanel panel;
public void createUI()
{
frame = new JFrame("Items one ove the other");
frame.setPreferredSize(new Dimension(600, 400));
frame.setLayout(new BorderLayout());
layeredPane = new JLayeredPane();
frame.add(layeredPane, BorderLayout.CENTER);
layeredPane.setBounds(0, 0, 600, 400);
ArrayList<Color> colorList = new ArrayList<Color>();
colorList.add(Color.red);
colorList.add(Color.yellow);
colorList.add(Color.blue);
colorList.add(Color.green);
colorList.add(Color.cyan);
for (int i=0; i<5; i++){
String mytext="no"+ i;
Panel1 = new myarea(mytext);
Panel1.setBackground(colorList.get(i));
if (i==0){Panel1.setBounds(210, 110, 20, 20);}
if (i==1){Panel1.setBounds(200, 100, 150, 150);}
if (i==2){Panel1.setBounds(250, 110, 170, 120);}
if (i==3){Panel1.setBounds(180, 130, 110, 110);}
if (i==4){Panel1.setBounds(450, 150, 50, 50);}
layeredPane.add(Panel1, new Integer(0), 0);
}
panel = new JPanel();
frame.add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
JavaJLayeredPane overlapPane = new JavaJLayeredPane();
overlapPane.createUI();
}
public class myarea extends JPanel implements MouseListener{
public String areaname;
public myarea(String myname) {
addMouseListener(this);
areaname=myname;
}
//LISTENERS
@Override
public void mousePressed(MouseEvent evt){
}
@Override
public void mouseReleased(MouseEvent evt){
}
@Override
public void mouseClicked(MouseEvent evt){
if(evt.getButton() == MouseEvent.BUTTON1){
JOptionPane.showMessageDialog(null,areaname ) ;
}
}
@Override
public void mouseEntered(MouseEvent evt){
}
@Override
public void mouseExited(MouseEvent evt){
}
}
}
如果我们点击另一个矩形,我们会得到它的名字。我们如何检查下面是否还有另一个矩形,如果有,我们如何获取它的属性?
【问题讨论】:
-
听起来对 JLayeredPane IMO 的使用真的很差。也许一个可运行的例子可能会改变我的想法。
-
@peeskillet。我的案子太复杂了,不能在这里发帖。凭什么不好用?在 JLayeredPane 中将一个组件放在另一个之上并没有错,当需要能够通过鼠标访问所有重叠的组件时也没有错。有吗?
-
如果要将所有组件放在同一层上,为什么还要使用 JlayeredPane?这就是我要表达的意思。
-
我同意这听起来有点可疑,所有组件都在同一层,但您可以将 MouseListener 添加到 JLayeredPane 本身,然后遍历其组件以查看哪个组件位于鼠标点击点。此外,没有人会要求您提供整个程序,但您的情况肯定不会太复杂,如果您将其归结为 minimal compilable and runnable example,则不会,这是需要付出努力的事情,但通常值得付出努力。
-
您的问题本质上很简单,但对我来说,要构建一个答案并对其进行测试,我必须创建自己的mcve,正如您所说的“很难”。既然这是你的问题,我的偏好是创建这个工具的首要任务应该是你的,而不是我的,但也许如果你等待更长的时间,其他人会过来,创建他们自己的,并为你解决它。如果这不会很快发生,请考虑重新考虑您不创建一个的决定。如果你改变主意,请通知我看一下。现在,我要退出。运气!
标签: java swing jlayeredpane