Я хочу создать hud-like ui, используя перетаскиваемые JComponents на прозрачном фоне. Минимальный пример того, что я до сих пор:Прозрачный JFrame с перетаскиваемыми компонентами
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/, результат был тот же.
Любые предложения?
В этом возможном [дубликате] рассматриваются два полных примера (http://stackoverflow.com/q/31327612/230513). – trashgod
Спасибо, один из ответов в этой теме решает мою проблему –