【发布时间】:2015-08-21 18:26:13
【问题描述】:
我想通过在透明背景上使用可拖动的 JComponents 创建一个类似 hud 的用户界面。到目前为止我所拥有的最小示例:
import java.awt.Color;
import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class TransparentFrame
extends JFrame {
public TransparentFrame() {
setLayout(null);
setUndecorated(true);
setBackground(new Color(1, 1, 1, 0.0f));
setLocationRelativeTo(null);
setSize(600, 500);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
JLabel label = new JLabel("ABC");
label.setBounds(100, 100, 60, 30);
label.setOpaque(true);
label.setBackground(Color.RED);
label.setForeground(Color.WHITE);
DraggableComponentListener listener = new DraggableComponentListener(label);
label.addMouseListener(listener);
label.addMouseMotionListener(listener);
add(label);
setVisible(true);
}
public static void main(String[] args) {
new TransparentFrame();
}
}
class DraggableComponentListener
extends MouseAdapter {
private Component component;
private volatile int screenX = 0;
private volatile int screenY = 0;
private volatile int componentX = 0;
private volatile int componentY = 0;
public DraggableComponentListener(Component component) {
this.component = component;
}
@Override
public void mousePressed(MouseEvent e) {
screenX = e.getXOnScreen();
screenY = e.getYOnScreen();
componentX = component.getX();
componentY = component.getY();
}
@Override
public void mouseDragged(MouseEvent e) {
int deltaX = e.getXOnScreen() - screenX;
int deltaY = e.getYOnScreen() - screenY;
component.setLocation(componentX + deltaX, componentY + deltaY);
}
}
当标签被拖动时,它会留下痕迹:它被绘制在它曾经所在的所有位置。我尝试将标签添加到 JPanel,将面板添加到框架并覆盖面板的 paintComponent 方法,如下所述:https://tips4java.wordpress.com/2009/05/31/backgrounds-with-transparency/,结果是一样的。
有什么建议吗?
【问题讨论】:
-
在这个可能的duplicate 中检查了两个完整的示例。
-
谢谢,该线程中的一个答案解决了我的问题
标签: java swing transparency draggable