Java JLayer:如何防止将事件删除到底层组件
嗨,我刚刚找到了JLayer函数。我想把它用作等待锁。如果激活该层,底层组件将接收所有事件(按键和鼠标)。如何在层中捕捉事件并防止委派 先谢谢你Java JLayer:如何防止将事件删除到底层组件,java,swing,events,jlayer,Java,Swing,Events,Jlayer,嗨,我刚刚找到了JLayer函数。我想把它用作等待锁。如果激活该层,底层组件将接收所有事件(按键和鼠标)。如何在层中捕捉事件并防止委派 先谢谢你 dbausndSwing将搜索父/子层次结构以查找侦听MouseEvent或KeyEvent的组件 因此,您需要在底层添加一个MouseListener和keysistener 例如,这是在中使用的一种方法。我以“设置忙碌指示器的动画”为例,覆盖了一些方法:processMouseEvent和带有条件e.consume()的processMouseEv
dbausndSwing将搜索父/子层次结构以查找侦听
MouseEvent
或KeyEvent
的组件
因此,您需要在底层添加一个MouseListener
和keysistener
例如,这是在中使用的一种方法。我以“设置忙碌指示器的动画”为例,覆盖了一些方法:processMouseEvent和带有条件e.consume()的processMouseEvent,当然还有
jlayer.setLayerEventMask(
AWTEvent.MOUSE_EVENT_MASK |
AWTEvent.MOUSE_MOTION_EVENT_MASK
);
class WaitLayerUI extends LayerUI<JPanel> implements ActionListener
{
private boolean mIsRunning;
private boolean mIsFadingOut;
private Timer mTimer;
private int mAngle;
private int mFadeCount;
private int mFadeLimit = 15;
@Override
public void installUI(JComponent c) {
super.installUI(c);
JLayer jlayer = (JLayer)c;
jlayer.setLayerEventMask(
AWTEvent.MOUSE_EVENT_MASK |
AWTEvent.MOUSE_MOTION_EVENT_MASK
);
}
@Override
public void uninstallUI(JComponent c) {
JLayer jlayer = (JLayer)c;
jlayer.setLayerEventMask(0);
super.uninstallUI(c);
}
@Override
protected void processMouseEvent(MouseEvent e, JLayer l) {
System.out.println("mouse event");
if (mIsRunning)
{
e.consume();
}
}
@Override
protected void processMouseMotionEvent(MouseEvent e, JLayer l) {
System.out.println("mouse motion event");
if (mIsRunning)
{
e.consume();
}
}
@Override
public void paint(Graphics g, JComponent c)
{
Graphics2D g2 = (Graphics2D)g.create();
try
{
int w = c.getWidth();
int h = c.getHeight();
// Paint the view.
super.paint(g, c);
if (!mIsRunning)
{
return;
}
float fade = (float)mFadeCount / (float)mFadeLimit;
// Gray it out.
Composite urComposite = g2.getComposite();
g2.setComposite(AlphaComposite.getInstance(
AlphaComposite.SRC_OVER, .5f * fade));
g2.fillRect(0, 0, w, h);
g2.setComposite(urComposite);
// Paint the wait indicator.
int s = Math.min(w, h) / 10;
int cx = w / 2;
int cy = h / 2;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setStroke(
new BasicStroke(s / 4, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
g2.setPaint(Color.white);
g2.rotate(Math.PI * mAngle / 180, cx, cy);
for (int i = 0; i < 12; i++)
{
float scale = (11.0f - (float)i) / 11.0f;
g2.drawLine(cx + s, cy, cx + s * 2, cy);
g2.rotate(-Math.PI / 6, cx, cy);
g2.setComposite(AlphaComposite.getInstance(
AlphaComposite.SRC_OVER, scale * fade));
}
}
catch (Exception ex) {
mIsRunning = false;
}
finally
{
g2.dispose();
}
}
public void actionPerformed(ActionEvent e)
{
if (mIsRunning)
{
firePropertyChange("tick", 0, 1);
mAngle += 3;
if (mAngle >= 360)
{
mAngle = 0;
}
if (mIsFadingOut)
{
if (--mFadeCount == 0)
{
mIsRunning = false;
mTimer.stop();
}
}
else if (mFadeCount < mFadeLimit)
{
mFadeCount++;
}
}
}
public void start()
{
if (mIsRunning)
{
return;
}
// Run a thread for animation.
mIsRunning = true;
mIsFadingOut = false;
mFadeCount = 0;
int fps = 24;
int tick = 1000 / fps;
mTimer = new Timer(tick, this);
mTimer.start();
}
public void stop()
{
mIsFadingOut = true;
}
@Override
public void applyPropertyChange(PropertyChangeEvent pce, JLayer l)
{
if ("tick".equals(pce.getPropertyName()))
{
l.repaint();
}
}
}
jlayer.setlayerventmask(
AWTEvent.MOUSE\u事件\u掩码|
AWTEvent.MOUSE\u MOTION\u EVENT\u MASK
);
类WaitLayerUI扩展了LayerUI实现ActionListener
{
私有布尔运算错误;
痛风;
私人定时器;
私营企业;
私人国际货币基金组织;
私有int mFadeLimit=15;
@凌驾
public void installUI(JComponent c){
super.installUI(c);
JLayer JLayer=(JLayer)c;
jlayer.setlayerventmask(
AWTEvent.MOUSE\u事件\u掩码|
AWTEvent.MOUSE\u MOTION\u EVENT\u MASK
);
}
@凌驾
公共用户界面(JComponentC){
JLayer JLayer=(JLayer)c;
jlayer.setlayerventmask(0);
super.ui(c);
}
@凌驾
受保护的void进程MouseEvent(MouseEvent e,JLayer l){
System.out.println(“鼠标事件”);
如果(错误运行)
{
e、 消费();
}
}
@凌驾
受保护的void processMouseMotionEvent(MouseEvent e,JLayer l){
System.out.println(“鼠标运动事件”);
如果(错误运行)
{
e、 消费();
}
}
@凌驾
公共空隙涂料(图形g、J组件c)
{
Graphics2D g2=(Graphics2D)g.create();
尝试
{
int w=c.getWidth();
int h=c.getHeight();
//绘制视图。
超级油漆(g,c);
如果(!运行错误)
{
返回;
}
浮动衰减=(浮动)mFadeCount/(浮动)mFadeLimit;
//把它涂成灰色。
复合urComposite=g2.getComposite();
g2.setComposite(AlphaComposite.getInstance(
AlphaComposite.SRC_超过0.5f*衰减);
g2.fillRect(0,0,w,h);
g2.setComposite(urComposite);
//为等待指示器上漆。
int s=数学最小值(w,h)/10;
int cx=w/2;
int-cy=h/2;
g2.setRenderingHint(RenderingHints.KEY_抗锯齿,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.设定行程(
新BasicStroke(s/4,BasicStroke.CAP_uRound,BasicStroke.JOIN_uRound));
g2.setPaint(颜色为白色);
g2.旋转(数学PI*mAngle/180,cx,cy);
对于(int i=0;i<12;i++)
{
浮动刻度=(11.0f-(浮动)i)/11.0f;
g2.拉线(cx+s,cy,cx+s*2,cy);
g2.旋转(-Math.PI/6,cx,cy);
g2.setComposite(AlphaComposite.getInstance(
AlphaComposite.SRC_超过,比例*衰减);
}
}
捕获(例外情况除外){
错误运行=错误;
}
最后
{
g2.dispose();
}
}
已执行的公共无效操作(操作事件e)
{
如果(错误运行)
{
火属性更改(“勾号”,0,1);
裂口+=3;
如果(撕裂>=360)
{
mAngle=0;
}
如果(痛风)
{
如果(--mFadeCount==0)
{
错误运行=错误;
mTimer.stop();
}
}
否则如果(mFadeCount