2016-04-29 16 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(); 
    } 

} 

感謝:)あなたはSwingコンポーネントで透明性を使用することはできません

答えて

1

。背景が透明であるため、これらのタイプのペイントの問題が発生します。 Swingコンポーネントは、不透明または非不透明のいずれかです。

この問題の詳細については、Backgrounds With Transparencyを参照してください。しかし、この原因では、Swingパネルで完全な透明度を使用しようとしているため問題にはなりません。

透明なウィンドウを再描画し、その上に矩形を描画しようとすると、前の矩形がそのまま残ります。

投稿したコードは、(少なくともWindowsでは)何でもします。フレームを完全に透明に設定すると、MouseEventはもはや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)); 
関連する問題