Как это можно оптимизировать? - PullRequest
0 голосов
/ 28 сентября 2011

Не уверен, будет ли он на самом деле более оптимизированным, однако, что я пытаюсь сделать, это взять весь этот код и, возможно, разделить его на разные классы? Пока это всего лишь один класс, но мы все больше и больше склоняемся к проектам с несколькими классами, поэтому я пытаюсь выяснить, как я могу разделить это и на самом деле помочь, а не просто разделить материал на части. Любая помощь будет отличной!

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 ]

3 голосов
/ 28 сентября 2011

Самое первое, что вы можете сделать, это заметить, что у каждого выбираемого параметра есть следующие общие черты:

  1. Все они имеют кнопку с пользовательским текстом, все они добавлены в основнойпанель и зарегистрируйте его в качестве слушателя.
  2. Они все что-то рисуют, но делают это немного по-другому.
  3. Они все способствуют actionPerformed()

Использование этогоДля наблюдения вы можете создать абстрактный класс DrawOperation, который выполняет 1 и 3, а также проверку () / repaint (), часть 2. Он также должен определять абстрактный метод для переменной части операции рисования.Затем вы можете расширить этот класс, чтобы обеспечить правильный метод draw() для каждой операции.(Продвинутый урок: посмотрите, как работают анонимные внутренние классы, и создайте свои операции как AIC.)

3 голосов
/ 28 сентября 2011

Я бы сделал это так:

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 голосов
/ 28 сентября 2011

Я, вероятно, сначала попытался бы внедрить этот оператор case в иерархию классов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...