在透明的框架上画一条线



我想构建一个简单的荧光笔程序。这个想法是设置一个图像来改变光标,使其看起来像一个荧光笔。然后,当我们移动光标时,它会随着我们的移动跟踪一条线。这里的要求是能够在透明的背景上绘制线条(虽然不是完全透明,但只有55%左右)。

到目前为止,我的进步是能够画线,透明的背景。然而,这条线也是透明的。下面是我的代码:左键点击开始绘制,右键点击停止,按空格键改变颜色。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
public class FreehandExample extends JFrame implements MouseListener, MouseMotionListener, KeyListener {
     private int counter = 0;
     private int draw = 0;
     private int red[] = {58,71,231,243,255};
     private int green[] = {54,224,235,109,40};
     private int blue[] = {241,95,61,52,40};
     private Point start, end;
     private Graphics gd; 
     public FreehandExample()
     {
        setUndecorated(true);
        setBackground(new Color(255,0,0));
        setSize(new Dimension(300,200));
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        addKeyListener(this);
        addMouseListener(this);
        addMouseMotionListener(this);
        setOpacity(0.55f);
        setVisible(true);
     }
    public void mousePressed(MouseEvent e) {
        start = new Point(e.getX(), e.getY()); 
    }
    public void mouseClicked(MouseEvent e) {
        if(e.getButton() == MouseEvent.BUTTON1) draw = 1;
        if(e.getButton() == MouseEvent.BUTTON3) draw = 0;
    }
    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}
    public void mouseReleased(MouseEvent e) {}
    public void mouseDragged(MouseEvent e)  {}
    public void mouseMoved(MouseEvent e) {
       gd = this.getGraphics();
       if(draw==1){
          end = new Point(e.getX(), e.getY());
          gd.setColor(new Color( red[counter],green[counter],blue[counter]));
          gd.drawLine(start.x, start.y, end.x, end.y);
          start = end;
       }
    }
    public static void main(String []args){
         new FreehandExample();
    }
    public void keyPressed(KeyEvent e) {
         if(e.getKeyCode() == KeyEvent.VK_SPACE) {
            counter++;
            if(counter>4) counter=0;
         }
    }
    public void keyReleased(KeyEvent e) {}
    public void keyTyped(KeyEvent e) {}
}

我尝试过逐像素透明度的概念…但是线条并没有马上画出来……在划定界限之前有一段时间的延迟。然而,它确实产生了正确的结果,例如线是不透明的,而框架是透明的。谁能帮我修改一下这个代码,使其符合要求…谢谢。

我已经设法解决了这个问题,使用像素透明度,感谢有人从emunewz论坛:)技巧是调用paintComponent()使用repaint()绘图后的所有时间,但fillRect()方法只需要调用一次,这样我们的线就不会消失。下面是我的代码:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.Paint;
import java.awt.Point;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class GradientTranslucentWindow extends JFrame implements KeyListener, MouseListener, MouseMotionListener {
private int counter = 0;
private int draw = -1;
private int red[] = {58,71,231,243,255};
private int green[] = {54,224,235,109,40};
private int blue[] = {241,95,61,52,40};
private int R = 240;
private int G = 240;
private int B = 200;
private Point start, end;
private Graphics gd; 
private JPanel panel;
public GradientTranslucentWindow() {
    setBackground(new Color(0,0,0,0));
    setSize(new Dimension(500,500));
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    panel = new JPanel() {
        @Override
        protected void paintComponent(Graphics g) {
            if (g instanceof Graphics2D) {
                Paint p =  new GradientPaint(0.0f, 0.0f, new Color(R, G, B, 0), 0.0f, getHeight(), new Color(R, G, B, 150), true);
                Graphics2D g2d = (Graphics2D)g;
                g2d.setPaint(p);
                if(draw==-1) g2d.fillRect(0, 0, getWidth(), getHeight());
            }
        }
    };
    setContentPane(panel);
    addKeyListener(this);
    addMouseListener(this);
    addMouseMotionListener(this);
}
public static void main(String[] args) {
   JFrame.setDefaultLookAndFeelDecorated(true);
   new GradientTranslucentWindow().setVisible(true);
}
public void mousePressed(MouseEvent e) { start = new Point(e.getX(), e.getY()); }
public void mouseClicked(MouseEvent e) {
    if(e.getButton() == MouseEvent.BUTTON1) draw = 1;
    if(e.getButton() == MouseEvent.BUTTON3) draw = 0;
}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseDragged(MouseEvent e)  {}
 public void mouseMoved(MouseEvent e) {
     gd = this.getGraphics();
     if(draw==1){
         end = new Point(e.getX(), e.getY());
         gd.setColor(new Color( red[counter],green[counter],blue[counter]));
         gd.drawLine(start.x, start.y, end.x, end.y);
         start = end;
         panel.repaint();           
         System.out.println(start.x + " - " + start.y);
     }
}
public void keyPressed(KeyEvent e) {
    if(e.getKeyCode() == KeyEvent.VK_SPACE) {
        counter++;
        if ( counter > 4 ) counter = 0;
    }
}
public void keyReleased(KeyEvent e) {}
public void keyTyped(KeyEvent e) {}
}

最新更新