gpt4 book ai didi

java - JLayeredPane:如何检查组件下面是否绘制了另一个组件

转载 作者:行者123 更新时间:2023-12-01 23:13:59 26 4
gpt4 key购买 nike

我有一个 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){
}
}


}

如果我们点击一​​个位于另一个矩形周围的矩形,我们就会得到它的名称。我们如何检查下面是否还有另一个矩形,如果是,我们如何获取它的属性?

最佳答案

基本上有两个任务:

  • 访问同一层中位于接收 mouseEvent 的组件下方的组件,并找到第一个包含鼠标位置的组件
  • 如果找到,请手动调度该事件(并在必要时让它处理进一步的调度)

JLayeredPane api 可帮助解决第一个问题,而 Component 有一个方法可实现第二个问题 - 唯一需要注意的是坐标变换,其中 SwingUtilities 的辅助方法将发挥作用

@Override
public void mouseClicked(MouseEvent evt) {
if (!SwingUtilities.isLeftMouseButton(evt)) return;
Component[] siblings = layeredPane.getComponentsInLayer(JLayeredPane.getLayer(this));
int pos = layeredPane.getPosition(this);
for (Component sibling : siblings) {
// interested in siblings below
if (layeredPane.getPosition(sibling) > pos) {
// convert coordinates
Point p = SwingUtilities.convertPoint(this, evt.getX(), evt.getY(), sibling);
if (sibling.contains(p)) {
// convert event
MouseEvent dispatch = SwingUtilities.convertMouseEvent(
this, evt, sibling);
// manually dispatch the event
sibling.dispatchEvent(dispatch);
break;
}
}

}
// do my own work
System.out.println(getName() + evt);
}

关于java - JLayeredPane:如何检查组件下面是否绘制了另一个组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21500162/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com