2016-04-29 3 views
0

Когда я пытаюсь перекрасить прозрачное окно и нарисую на нем прямоугольник, предыдущий прямоугольник останется. Цель состоит в том, чтобы выбрать область на экране, щелкнув и перемещая мышь. It'll look like this if you move your mouse for a whileПрозрачный JFrame не очищается от перерисовки

Удаляя прозрачность, он отлично работает.

Я пробовал все, что мог найти в Stack Overflow по этой теме, но я не смог заставить его работать как на Windows, так и на Linux.

Основной класс

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionAdapter; 

public class Main { 
    private JFrame frame; 
    private boolean pressing = false; 
    private boolean selected = false; 
    private ScreenSelectPanel p; 

    public Main() { 
     Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); 
     frame = new JFrame("ScreenSelection"); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frame.setSize(dim); 
     frame.setUndecorated(true); 

     frame.setContentPane(p = new ScreenSelectPanel()); 
     registerListeners(); 

     frame.getContentPane().setBackground(new Color(255, 255, 255, 0)); 
     frame.setBackground(new Color(255, 255, 255, 0)); 
     frame.setLayout(new BorderLayout()); 

     frame.setAlwaysOnTop(true); 
     frame.setVisible(true); 
    } 

    private void registerListeners() { 
     p.setFocusable(true); 
     p.requestFocusInWindow(); 

     p.addMouseMotionListener(new MouseMotionAdapter() { 
      @Override 
      public void mouseDragged(MouseEvent e) { 
       if (selected) 
        return; 
       setLoc(e); 
       p.repaint(); 

      } 

      @Override 
      public void mouseMoved(MouseEvent e) { 
       if (selected) 
        return; 
       setLoc(e); 
       if (!pressing) 
        setStartLoc(e); 
       p.repaint(); 
      } 
     }); 
     p.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseClicked(MouseEvent e) { 
       setLoc(e); 
       setStartLoc(e); 
       p.repaint(); 
      } 

      @Override 
      public void mouseEntered(MouseEvent e) { 
       setLoc(e); 
       setStartLoc(e); 
       p.repaint(); 

      } 
     }); 
    } 

    public void setStartLoc(MouseEvent e) { 
     p.mouseStartX = e.getX(); 
     p.mouseStartY = e.getY(); 
    } 

    public void setLoc(MouseEvent e) { 
     p.mouseX = e.getX(); 
     p.mouseY = e.getY(); 
    } 

    public static void main(String[] args) { 
     new Main(); 
    } 
} 

ScreenSelectPanel класс

import javax.swing.*; 
import java.awt.*; 
import java.awt.geom.Point2D; 
import java.awt.image.BufferedImage; 

public class ScreenSelectPanel extends JPanel { 
    public int mouseX = 0; 
    public int mouseY = 0; 
    public int mouseStartX = 0; 
    public int mouseStartY = 0; 

    private Color borderColor; 

    public ScreenSelectPanel() { 
     setOpaque(false); 
     borderColor = Color.BLACK; 
    } 

    public void setBorderColor(Color c) { 
     this.borderColor = c; 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     Graphics2D g2d = (Graphics2D) g; 

     g2d.setColor(borderColor); 
     Rectangle rect = new Rectangle(); 
     rect.setFrameFromDiagonal(new Point2D.Float(mouseStartX, mouseStartY), new Point2D.Float(mouseX, mouseY)); 
     Stroke dashed = new BasicStroke(3, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, new float[]{9}, 0); 
     g2d.setStroke(dashed); 
     g2d.drawRect(rect.x, rect.y, rect.width, rect.height); 

     g2d.dispose(); 
    } 

} 

Спасибо :)

ответ

1

Вы не можете использовать прозрачность работы с компонентами Swing. Прозрачный фон вызывает эти проблемы с живописью. Компонент Swing является либо непрозрачным, либо непрозрачным.

Отъезд Backgrounds With Transparency для получения дополнительной информации по этой проблеме. Однако по этой причине это не проблема, потому что вы пытаетесь использовать полную прозрачность на панели Swing.

Когда я пытаюсь перерисовать прозрачное окно и нарисую на нем прямоугольник, предыдущий прямоугольник останется.

Код, который вы отправили, делает что-либо (по крайней мере, в Windows). Когда вы устанавливаете кадр полностью прозрачным, MouseEvents больше не обрабатываются Swing и вместо этого обрабатываются приложением под фреймом.

Я сделал следующие изменения в свой код, и это, кажется, работает для меня:

//frame.getContentPane().setBackground(new Color(255, 255, 255, 0)); 
//frame.setBackground(new Color(255, 255, 255, 0)); 
frame.setBackground(new Color(255, 255, 255, 10)); 
Смежные вопросы