2015-08-21 2 views
0

Я хочу создать 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/, результат был тот же.

Любые предложения?

+0

В этом возможном [дубликате] рассматриваются два полных примера (http://stackoverflow.com/q/31327612/230513). – trashgod

+1

Спасибо, один из ответов в этой теме решает мою проблему –

ответ

0

К сожалению, он работает правильно на моей машине (не оставляет следов). Попробуйте добавить frame.repaint() после изменения местоположения компонента. Используйте вариацию repaint, которая занимает область краски для повышения производительности.

+0

Я только что проверил, код, который я опубликовал, работает на окнах, но не на kde ubuntu, который я использую. Я пробовал фрейм. repaint(), validate() и т. д., все равно такое же поведение –

Смежные вопросы