[英]Help making an eraser for a paint program in java
為一個班級制定一個非常基本的繪畫程序,其中一項要求是我們必須制造一個橡皮擦。 不確定如何執行操作,我們正在使用bufferedimage,然后將其粘貼到我們的jframe中。 關於如何實現的任何想法/任何代碼示例? 有人告訴我嘗試使用clearRect,但也許我只是在錯誤地使用它,但我無法接受它。 任何幫助/代碼示例都很棒,這是我的代碼,所有這些都是一個類。
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.LineBorder;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.*;
public class PaintProgram extends JPanel implements MouseListener,ActionListener
{
public static int stroke, eraser = 0;
private int xX1, yY1 , xX2, yY2, choice ;
public static void main(String [] args)
{
new PaintProgram();
}
PaintProgram()
{
JFrame frame = new JFrame("Paint Program");
frame.setSize(1200, 800);
frame.setBackground(Color.WHITE);
frame.getContentPane().add(this);
JMenuBar menuBar = new JMenuBar();
frame.setJMenuBar(menuBar);
JMenu help = new JMenu("Help");
menuBar.add(help);
JMenuItem about = new JMenuItem("About");
help.add(about);
about.addActionListener(this);
JButton button1 = new JButton("Clear");
button1.addActionListener(this);
JButton color = new JButton("Color");
color.addActionListener(this);
JButton erase = new JButton("Erase?");
erase.addActionListener(this);
JButton button2 = new JButton("Empty Rect");
button2.addActionListener(this);
JButton button3 = new JButton("Filled oval");
button3.addActionListener(this);
JButton button4 = new JButton("Filled Rect");
button4.addActionListener(this);
JButton button5 = new JButton("Empty oval");
button5.addActionListener(this);
JButton button6 = new JButton("Line");
button6.addActionListener(this);
JRadioButton thin = new JRadioButton("Thin Line");
thin.addActionListener(this);
JRadioButton medium = new JRadioButton("Medium Line");
medium.addActionListener(this);
JRadioButton thick = new JRadioButton("Thick Line");
thick.addActionListener(this);
ButtonGroup lineOption = new ButtonGroup( );
lineOption.add(thin);
lineOption.add(medium);
lineOption.add(thick);
this.add(button1);
this.add(color);
this.add(erase);
this.add(button2);
this.add(button3);
this.add(button4);
this.add(button5);
this.add(button6);
this.add(thin);
this.add(medium);
this.add(thick);
addMouseListener(this);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
if(grid == null){
int w = this.getWidth();
int h = this.getHeight();
grid = (BufferedImage)(this.createImage(w,h));
gc = grid.createGraphics();
gc.setColor(Color.BLUE);
}
g2.drawImage(grid, null, 0, 0);
check();
}
BufferedImage grid;
Graphics2D gc;
public void draw()
{
Graphics2D g = (Graphics2D)getGraphics();
int w = xX2 - xX1;
if (w<0)
w = w *(-1);
int h = yY2-yY1;
if (h<0)
h= h*(-1);
switch(choice)
{
case 1:
check();
gc.drawRect(xX1, yY1, w, h);
repaint();
break;
case 2:
check();
gc.drawOval(xX1, yY1, w, h);
repaint();
break;
case 3:
check();
gc.drawRect(xX1, yY1, w, h);
gc.fillRect(xX1, yY1, w, h);
repaint();
break;
case 4:
check();
gc.drawOval(xX1, yY1, w, h);
gc.fillOval(xX1, yY1, w, h);
repaint();
break;
case 5:
if (stroke == 0)
gc.setStroke(new BasicStroke (1));
if (stroke == 1)
gc.setStroke(new BasicStroke (3));
if (stroke == 2)
gc.setStroke(new BasicStroke (6));
gc.drawLine(xX1, yY1, xX2, yY2);
repaint();
break;
case 6:
repaint();
Color temp = gc.getColor();
gc.setColor(Color.WHITE);
gc.fillRect(0, 0, getWidth(), getHeight());
gc.setColor(temp);
repaint();
break;
case 7:
if (eraser == 1)
{
gc.clearRect(xX1, yY1, w, h);
}
else
{
}
break;
}
}
public void check()
{
if (xX1 > xX2)
{
int z = 0;
z = xX1;
xX1 = xX2;
xX2 =z;
}
if (yY1 > yY2)
{
int z = 0;
z = yY1;
yY1 = yY2;
yY2 = z;
}
}
public void actionPerformed(ActionEvent e)
{
if (e.getActionCommand().equals("Color"))
{
Color bgColor
= JColorChooser.showDialog(this,"Choose Background Color", getBackground());
if (bgColor != null)
gc.setColor(bgColor);
}
if (e.getActionCommand().equals("About"))
{
System.out.println("About Has Been Pressed");
JFrame about = new JFrame("About");
about.setSize(300, 300);
JButton picture = new JButton(new ImageIcon("C:/Users/TehRobot/Desktop/Logo.png"));
about.add(picture);
about.setVisible(true);
}
if (e.getActionCommand().equals("Empty Rect"))
{
System.out.println("Empty Rectangle Has Been Selected~");
choice = 1;
}
if (e.getActionCommand().equals("Empty oval"))
{
System.out.println("Empty Oval Has Been Selected!");
choice = 2;
}
if (e.getActionCommand().equals("Filled Rect"))
{
System.out.println("Filled Rectangle Has Been Selected");
choice = 3;
}
if (e.getActionCommand().equals("Filled oval"))
{
System.out.println("Filled Oval Has Been Selected");
choice = 4;
}
if (e.getActionCommand().equals("Line"))
{
System.out.println("Draw Line Has Been Selected");
choice = 5;
}
if (e.getActionCommand().equals("Thin Line"))
{
stroke = 0;
}
if (e.getActionCommand().equals("Medium Line"))
{
stroke = 1;
}
if (e.getActionCommand().equals("Thick Line"))
{
stroke = 2;
}
if(e.getActionCommand().equals("Erase?"))
{
eraser = 1;
choice = 7;
}
if (e.getActionCommand().equals("Clear"))
{
System.out.println("Clear All The Things!!!");
choice = 6;
draw();
}
}
public void mouseExited(MouseEvent evt){}
public void mouseEntered(MouseEvent evt){}
public void mouseClicked(MouseEvent evt){}
public void mousePressed(MouseEvent evt)
{
xX1 = evt.getX();
yY1= evt.getY();
}
public void mouseReleased(MouseEvent evt)
{
xX2 =evt.getX();
yY2=evt.getY();
draw();
eraser = 0;
}
}
我在添加/更改代碼的地方添加了注釋。
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
public class PaintProgram extends JPanel implements MouseListener, ActionListener,
/**
* CHANGE BY S AQEEL : implement mouse motion listener
*/
MouseMotionListener
{
/**
*
*/
private static final long serialVersionUID = 1L;
public static int stroke, eraser = 0;
private int xX1, yY1, xX2, yY2, choice;
/**
* CHANGE BY S AQEEL : Define a constant for background color, because we are using it at a lot of places
*/
private static final Color BACKGROUND_COLOR = Color.WHITE;
/**
* CHANGE BY S AQEEL : Also define variables for eraser width and height. In a more usable implementation you can allow user to change eraser size
*/
private int eraserWidth = 40;
private int eraserHeight = 40;
public static void main(String[] args)
{
new PaintProgram();
}
PaintProgram()
{
JFrame frame = new JFrame("Paint Program");
frame.setSize(1200, 800);
/**
* CHANGE BY S AQEEL : Use constant instead of hardcoding
*/
frame.setBackground(BACKGROUND_COLOR);
frame.getContentPane().add(this);
JMenuBar menuBar = new JMenuBar();
frame.setJMenuBar(menuBar);
JMenu help = new JMenu("Help");
menuBar.add(help);
JMenuItem about = new JMenuItem("About");
help.add(about);
about.addActionListener(this);
JButton button1 = new JButton("Clear");
button1.addActionListener(this);
JButton color = new JButton("Color");
color.addActionListener(this);
JButton erase = new JButton("Erase?");
erase.addActionListener(this);
JButton button2 = new JButton("Empty Rect");
button2.addActionListener(this);
JButton button3 = new JButton("Filled oval");
button3.addActionListener(this);
JButton button4 = new JButton("Filled Rect");
button4.addActionListener(this);
JButton button5 = new JButton("Empty oval");
button5.addActionListener(this);
JButton button6 = new JButton("Line");
button6.addActionListener(this);
JRadioButton thin = new JRadioButton("Thin Line");
thin.addActionListener(this);
JRadioButton medium = new JRadioButton("Medium Line");
medium.addActionListener(this);
JRadioButton thick = new JRadioButton("Thick Line");
thick.addActionListener(this);
ButtonGroup lineOption = new ButtonGroup();
lineOption.add(thin);
lineOption.add(medium);
lineOption.add(thick);
this.add(button1);
this.add(color);
this.add(erase);
this.add(button2);
this.add(button3);
this.add(button4);
this.add(button5);
this.add(button6);
this.add(thin);
this.add(medium);
this.add(thick);
addMouseListener(this);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
if (grid == null)
{
int w = this.getWidth();
int h = this.getHeight();
grid = (BufferedImage) (this.createImage(w, h));
gc = grid.createGraphics();
gc.setColor(Color.BLUE);
}
g2.drawImage(grid, null, 0, 0);
check();
}
BufferedImage grid;
Graphics2D gc;
public void draw()
{
Graphics2D g = (Graphics2D) getGraphics();
int w = xX2 - xX1;
if (w < 0)
w = w * (-1);
int h = yY2 - yY1;
if (h < 0)
h = h * (-1);
switch (choice)
{
case 1:
check();
gc.drawRect(xX1, yY1, w, h);
repaint();
break;
case 2:
check();
gc.drawOval(xX1, yY1, w, h);
repaint();
break;
case 3:
check();
gc.drawRect(xX1, yY1, w, h);
gc.fillRect(xX1, yY1, w, h);
repaint();
break;
case 4:
check();
gc.drawOval(xX1, yY1, w, h);
gc.fillOval(xX1, yY1, w, h);
repaint();
break;
case 5:
if (stroke == 0)
gc.setStroke(new BasicStroke(1));
if (stroke == 1)
gc.setStroke(new BasicStroke(3));
if (stroke == 2)
gc.setStroke(new BasicStroke(6));
gc.drawLine(xX1, yY1, xX2, yY2);
repaint();
break;
case 6:
repaint();
Color temp = gc.getColor();
/**
* CHANGE BY S AQEEL : Use constant instead of hardcoding
*/
gc.setColor(BACKGROUND_COLOR);
gc.fillRect(0, 0, getWidth(), getHeight());
gc.setColor(temp);
repaint();
break;
case 7:
if (eraser == 1)
{
gc.clearRect(xX1, yY1, w, h);
}
else
{
}
break;
}
}
public void check()
{
if (xX1 > xX2)
{
int z = 0;
z = xX1;
xX1 = xX2;
xX2 = z;
}
if (yY1 > yY2)
{
int z = 0;
z = yY1;
yY1 = yY2;
yY2 = z;
}
}
public void actionPerformed(ActionEvent e)
{
/**
* CHANGE BY S AQEEL : Remove mousemotionlistener(which is added when eraser is selected) So that if another control is pressed, the user does
* not accidentally erases
*/
super.removeMouseMotionListener(this);
if (e.getActionCommand().equals("Color"))
{
Color bgColor = JColorChooser.showDialog(this, "Choose Background Color", getBackground());
if (bgColor != null)
gc.setColor(bgColor);
}
if (e.getActionCommand().equals("About"))
{
System.out.println("About Has Been Pressed");
JFrame about = new JFrame("About");
about.setSize(300, 300);
JButton picture = new JButton(new ImageIcon("C:/Users/TehRobot/Desktop/Logo.png"));
about.add(picture);
about.setVisible(true);
}
if (e.getActionCommand().equals("Empty Rect"))
{
System.out.println("Empty Rectangle Has Been Selected~");
choice = 1;
}
if (e.getActionCommand().equals("Empty oval"))
{
System.out.println("Empty Oval Has Been Selected!");
choice = 2;
}
if (e.getActionCommand().equals("Filled Rect"))
{
System.out.println("Filled Rectangle Has Been Selected");
choice = 3;
}
if (e.getActionCommand().equals("Filled oval"))
{
System.out.println("Filled Oval Has Been Selected");
choice = 4;
}
if (e.getActionCommand().equals("Line"))
{
System.out.println("Draw Line Has Been Selected");
choice = 5;
}
if (e.getActionCommand().equals("Thin Line"))
{
stroke = 0;
}
if (e.getActionCommand().equals("Medium Line"))
{
stroke = 1;
}
if (e.getActionCommand().equals("Thick Line"))
{
stroke = 2;
}
if (e.getActionCommand().equals("Erase?"))
{
eraser = 1;
choice = 7;
/**
* CHANGE BY S AQEEL : Add mousemotionlistener here.
*/
super.addMouseMotionListener(this);
}
if (e.getActionCommand().equals("Clear"))
{
System.out.println("Clear All The Things!!!");
choice = 6;
draw();
}
}
public void mouseExited(MouseEvent evt)
{
}
public void mouseEntered(MouseEvent evt)
{
}
public void mouseClicked(MouseEvent evt)
{
}
public void mousePressed(MouseEvent evt)
{
xX1 = evt.getX();
yY1 = evt.getY();
}
public void mouseReleased(MouseEvent evt)
{
xX2 = evt.getX();
yY2 = evt.getY();
draw();
eraser = 0;
}
/**
* CHANGE BY S AQEEL : MouseMotionListener functions implemented. Note this listener is only registered when eraser is selected
*/
public void mouseDragged(MouseEvent me)
{
Color c = gc.getColor();
gc.setColor(BACKGROUND_COLOR);
gc.drawRect(me.getX(), me.getY(), eraserWidth, eraserHeight);
gc.fillRect(me.getX(), me.getY(), eraserWidth, eraserHeight);
gc.setColor(c);
repaint();
}
public void mouseMoved(MouseEvent arg0)
{
}
}
現在,您的問題已解決,您應該嘗試添加很少但可用的質量功能,例如:使用不同的光標繪制/擦除不同的形狀。 允許用戶更改橡皮擦大小。 同樣在當前實現中,用戶必須拖動橡皮擦來擦除,您應該添加一項功能,以便用戶只需單擊即可拖動點(拖動除外)。
橡皮擦就像筆一樣,只是將顏色設置為背景色。 擦除時,將筆下的當前顏色替換為“背景”顏色,這使其看起來像背景,從而有效地消除了以前在屏幕上繪制的可感知顏色。
如果您的應用程序處理透明膠片,那么您的橡皮擦可能會將顏色設置為透明; 但這是相同的想法,因為“透明度”只是顏色分量之一,例如紅色,綠色和藍色。
如果您想要一個按鈕來擦除整個圖形,則只需以背景顏色繪制一個與屏幕一樣大的矩形。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.