如何优化?/ Class Splitting

时间:2011-09-27 22:18:45

标签: java swing class refactoring

不确定它是否会实际上更优化,但是我想要做的是采用所有这些代码并可能将其拆分到不同的类中?到目前为止,它只是一个类,但我们已经越来越多地倾向于多个类项目,所以我试图弄清楚我如何分裂它并实际上有帮助,而不是只是分裂的东西分裂它。任何帮助都会很棒!

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();
   }
}

3 个答案:

答案 0 :(得分:3)

您可以做的第一件事就是观察每个可选择的选项都有以下共同特征:

  1. 它们都有一个带有自定义文本的按钮,它们都被添加到主面板并将其注册为监听器。
  2. 他们都画了一些东西,但他们做的略有不同。
  3. 他们都参与actionPerformed()
  4. 使用此观察,您可以创建执行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语句分解为类层次结构。