2011-11-23 7 views
1

간단한 하이 라이터 프로그램을 만들고 싶습니다. 생각은 형광펜처럼 보일 수 있도록 이미지를 설정하여 커서를 변경하는 것입니다. 그리고 나서 커서를 움직이면 우리의 움직임과 함께 선을 따라갈 것입니다. 여기에있는 요구 사항은 투명 배경에 선을 그릴 수있는 것입니다 (완전히 투명하지는 않지만 약 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) {} 
} 

나는 픽셀 별 투명도의 개념을 시도 ...하지만 선 그리기 즉시 인출되지 않습니다. 그러나 실제로 프레임이 투명한 동안 선이 투명하지 않은 올바른 결과를 산출합니다. 누군가이 코드를 수정하여 요구 사항을 충족하도록 도울 수 있습니까? 감사합니다. .

답변

0

필자는 emunewz 포럼의 누군가 덕분에 픽셀 당 투명도를 사용하여이 문제를 해결할 수있었습니다 :) 트릭은 그리기 후에 항상 repaint()를 사용하여 paintComponent()를 호출하는 것이지만 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) {} 
}