不确定它是否会实际上更优化,但是我想要做的是采用所有这些代码并可能将其拆分到不同的类中?到目前为止,它只是一个类,但我们已经越来越多地倾向于多个类项目,所以我试图弄清楚我如何分裂它并实际上有帮助,而不是只是分裂的东西分裂它。任何帮助都会很棒!
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.util.*;
public class PaintProgram extends JPanel implements MouseListener,ActionListener
{
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.getContentPane().add(this);
JButton button1 = new JButton("Clear");
button1.addActionListener(this);
JButton button2 = new JButton("Filled rectangle");
button2.addActionListener(this);
JButton button3 = new JButton("Filled oval");
button3.addActionListener(this);
JButton button4 = new JButton("Empty rectangle");
button4.addActionListener(this);
JButton button5 = new JButton("Empty oval");
button5.addActionListener(this);
JButton button6 = new JButton("Line");
button6.addActionListener(this);
this.add(button1);
this.add(button2);
this.add(button3);
this.add(button4);
this.add(button5);
this.add(button6);
addMouseListener(this);
frame.setVisible(true);
}
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();
}
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.setColor(Color.YELLOW);
gc.drawRect(xX1, yY1, w, h);
repaint();
break;
case 2:
check();
gc.setColor(Color.CYAN);
gc.drawOval(xX1, yY1, w, h);
repaint();
break;
case 3:
check();
gc.setColor(Color.ORANGE);
gc.drawRect(xX1, yY1, w, h);
gc.fillRect(xX1, yY1, w, h);
repaint();
break;
case 4:
check();
gc.drawOval(xX1, yY1, w, h);
gc.setColor(Color.PINK);
gc.fillOval(xX1, yY1, w, h);
repaint();
break;
case 5:
check();
gc.setColor(Color.MAGENTA);
gc.drawLine(xX1, yY1, xX2, yY2);
repaint();
break;
case 6:
//Acquire clear screen or gay
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("Empty rectangle"))
{
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 rectangle"))
{
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("Clear"))
{
System.out.println("Clear All The Things!!!");
choice = 6;
repaint();
}
}
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();
}
}
答案 0 :(得分:3)
您可以做的第一件事就是观察每个可选择的选项都有以下共同特征:
actionPerformed()
使用此观察,您可以创建执行1和3的抽象DrawOperation
类以及2的check()/ repaint()部分。它还应该为绘制操作的可变部分定义抽象方法。然后,您可以扩展此类,以便为每个操作提供正确的draw()
方法。 (高级课程:查看匿名内部类的工作方式,并将您的操作创建为AIC。)
答案 1 :(得分:3)
我会这样做:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
public class PaintProgram extends JPanel implements MouseListener
{
private int xX1, yY1 , xX2, yY2;
private PaintOperation currentOperation;
private void setCurrentOperation(PaintOperation po) { currentOperation = po; }
private class PaintOperation {
private int choice;
public PaintOperation(final PaintProgram context, String text, int choice) {
this.choice = choice;
final JButton button = new JButton(text);
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
context.setCurrentOperation(PaintOperation.this);
context.repaint();
System.out.println("PaintOperation: "+button.getText());
}
});
context.add(button);
}
}
public static void main(String [] args)
{
new PaintProgram();
}
PaintProgram()
{
JFrame frame = new JFrame("Paint Program");
frame.setSize(1200, 800);
frame.getContentPane().add(this);
new PaintOperation(this, "Empty rectangle", 1);
new PaintOperation(this, "Empty oval", 2);
new PaintOperation(this, "Filled rectangle", 3);
new PaintOperation(this, "Filled oval", 4);
new PaintOperation(this, "Line", 5);
setCurrentOperation(new PaintOperation(this, "Clear", 6));
addMouseListener(this);
frame.setVisible(true);
}
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();
}
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(currentOperation.choice)
{
case 1:
check();
gc.setColor(Color.YELLOW);
gc.drawRect(xX1, yY1, w, h);
repaint();
break;
case 2:
check();
gc.setColor(Color.CYAN);
gc.drawOval(xX1, yY1, w, h);
repaint();
break;
case 3:
check();
gc.setColor(Color.ORANGE);
gc.drawRect(xX1, yY1, w, h);
gc.fillRect(xX1, yY1, w, h);
repaint();
break;
case 4:
check();
gc.drawOval(xX1, yY1, w, h);
gc.setColor(Color.PINK);
gc.fillOval(xX1, yY1, w, h);
repaint();
break;
case 5:
check();
gc.setColor(Color.MAGENTA);
gc.drawLine(xX1, yY1, xX2, yY2);
repaint();
break;
case 6:
//Acquire clear screen or gay
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 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();
}
}
答案 2 :(得分:2)
我可能会首先尝试将该case语句分解为类层次结构。