Странный фон в JPanel - PullRequest
       75

Странный фон в JPanel

0 голосов
/ 21 февраля 2019

У меня есть несколько идентичных расширенных экземпляров JPanel, каждый с прозрачным фоном, сделанный с помощью Color(255, 255, 255, 0);.Когда mousePressed() любого JPanel запускается, его фон устанавливается в сплошной цвет.

Проблема в том, что в течение первых нескольких миллисекунд после нажатия мыши (ленивец просто ее преодолеет) фон становится изображением JComponent, нажатым до .

Я надеюсь, что есть какой-то «очиститель памяти» или какой-то метод управления теми действиями JComponent, о которых я не знаю ...

edit:

        addMouseListener(new MouseListener() {
        boolean mousePressed;
        public void mouseClicked(MouseEvent e) {}
        Timer timer;
        public void mousePressed(MouseEvent e) {
            setBackground(new Color(255, 255, 255, 20));
            setBorder(BorderFactory.createLineBorder(new Color(255, 255, 255, 100), 3));
            repaint();
            timer = new Timer();
            mousePressed = true;
            timer.scheduleAtFixedRate(new TimerTask() { //keep jpanel position relative to mouse position
                Point pC = MouseInfo.getPointerInfo().getLocation();
                Point pP = MouseInfo.getPointerInfo().getLocation();
                Point sP = getLocation();
                public void run() {
                    if(mousePressed) {
                        pC = MouseInfo.getPointerInfo().getLocation();
                        setLocation(sP.x + (pC.x - pP.x), sP.y + (pC.y - pP.y));
                        pP = pC;
                        sP = getLocation(); 
                    } else {
                        pC = MouseInfo.getPointerInfo().getLocation();
                        pP = MouseInfo.getPointerInfo().getLocation();
                        sP = getLocation();
                    }
                }
            },  5, 5);
        }
        public void mouseReleased(MouseEvent e) {
            mousePressed = false;
            setBackground(null);
            setBorder(null);
            repaint();
            timer.cancel();
        }

1 Ответ

0 голосов
/ 21 февраля 2019

Решено путем переопределения paintComponent() метода и установки непрозрачности на false

JPanel panel = new JPanel();
protected void paintComponent(Graphics g)
    {
        g.setColor(getBackground());
        g.fillRect(0, 0, getWidth(), getHeight());
        super.paintComponent(g);
    } 
};
panel.setOpaque(false); // background of parent will be painted first
panel.setBackground( new Color(255, 0, 0, 20) );
frame.add(panel);    
...