Рисование простых фигур мышкой


Я хочу сделать фигуры прямоугольник и круг. Как я могу сделать код более элегантным?

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class r extends JPanel
{
      public int x1,x2,y1,y2;
      public static double SWITCH;
      public r()
      {
          setBackground(Color.WHITE);
          addMouseListener(new MouseAdapter()
          {
               public void mousePressed(MouseEvent m)
               {
               x1=m.getX();
               y1=m.getY();
               repaint();
               }
               public void mouseReleased(MouseEvent m)
               {
               x2=m.getX();
               y2=m.getY();
               repaint();
               }
          });
          addMouseMotionListener(new MouseMotionAdapter()
          {
              public void mouseDragged(MouseEvent m)
              {
                 x2=m.getX();
                 y2=m.getY();
                 repaint();
              }
          });
      }
      public void paintComponent(Graphics g)
      { 
          super.paintComponent(g);
          if(SWITCH == 2)
          {
              g.drawRect(x1, y1, x2, y2);
          }
          else if (SWITCH == 3)
          {
              g.drawOval(x1,y1,x2,y2);
          }
          else
          {
              g.drawString("qwe", x1, y1);
          }
      }

  }
  public class q extends JFrame
  {
      public static void main(String[] args)
      {
          q window = new q();
          window.setVisible(true);
          window.setSize(1024, 800);
          window.setDefaultCloseOperation(EXIT_ON_CLOSE);
          Container cont = window.getContentPane();
          cont.setLayout(new GridLayout(2,2));
          r panel = new r();
          JPanel BPanel = new JPanel();
          cont.add(panel);
          cont.add(BPanel);
          BPanel.setBackground(Color.blue);
          JButton button1,button2;
          button1 = new JButton("Rect");
          button2 = new JButton("Oval");
          BPanel.add(button1);
          BPanel.add(button2);
          button1.addActionListener(new ActionListener() {

              public void actionPerformed(ActionEvent e)
              {
                  r.SWITCH = 2;
              }
          });
          button2.addActionListener(new ActionListener() {

              public void actionPerformed(ActionEvent e)
              {
                  r.SWITCH = 3;
              }
          });
      }
  }


23912
3
задан 23 июля 2011 в 09:07 Источник Поделиться
Комментарии
2 ответа

Просто несколько мыслей...

Вы используете X и y координаты. Почему бы не воспользоваться этой точки класса? На события mouseevent класс имеет методы, которые возвращают объекты точку, и это, вероятно, сделает ваш код более читабельным. X1 и Y1 ничего не значат для меня, но вы могли бы дать осмысленные имена точек лице (Х1, Y1) и (Х2, У2).

Использование магических чисел (хранение 2 и 3 на переключателе, например) является плохой практикой. Использовать константы типа intS или (как Landei предложено в комментариях) является перечислимой. Это позволит вам улучшить чтения и понятность кода - при первом прочтении я не получить то, что вы делаете.

Согласно стандартов Java, имена классов должны начинаться с большой буквы. Ваш класс В настоящее время называется Р. Вы должны дать ему осмысленное имя. Возможно, вы также захотите взглянуть на другие стандарты Java для форматирования кода с точки зрения бандажа размещение, отступы и так далее. Для меня, ваш код просто трудно читать из-за форматирования.

Нежели если и переключатель/случае заявления, рассмотреть использование полиморфизма для того, чтобы нарисовать различные формы. Перенести логику рисовать разные фигуры в конкретных подклассов, в то время как возможно, сохраняя общую логику в суперклассе.

5
ответ дан 24 июля 2011 в 12:07 Источник Поделиться

Еще пару мыслей.

Используйте заглавные буквы в названии класса.

Отдельный ваш пример на два класса, скажем DrawPanel для своего класса, который создает тиражную комиссию и DrawObjects класса, создания объектов чертежа.

Добавить несколько комментариев в коде, объясняя, что вы пытаетесь сделать и почему.
Использовать конструкторы, чтобы очистить ваш код и сделать его более читабельным.

Я сделал несколько улучшений в код и поставить на два класса ниже, посмотрите и задавайте вопросы.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class DrawPanel extends JFrame
{
private DrawObjects panel = new DrawObjects();
private JPanel BPanel = new JPanel();
private JFrame window = new JFrame();

//constructor
DrawPanel(){
buildGUI();
}

void buildGUI(){
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setLayout(new GridLayout(2,2));
window.add(panel);
window.add(BPanel);
BPanel.setBackground(Color.blue);

//define buttons and add to panel
JButton rect = new JButton("Rect");
JButton oval = new JButton("Oval");
BPanel.add(rect);
BPanel.add(oval);

rect.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
panel.setType(1);
}
});

oval.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
panel.setType(2);
}
});

window.setVisible(true);
window.setSize(1024, 800);
}

public static void main(String[] args)
{
//create this object
new DrawPanel();
}

}//end class

два класса

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class DrawObjects extends JPanel
{
public int x1,x2,y1,y2;
public int type = 1;//default draw type

public DrawObjects()
{
init();
}

public void init(){
setBackground(Color.WHITE);
addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent m)
{
x1 = m.getX();
y1 = m.getY();
repaint();
}
public void mouseReleased(MouseEvent m)
{
x2 = m.getX();
y2 = m.getY();
repaint();
}
});

addMouseMotionListener(new MouseMotionAdapter()
{
public void mouseDragged(MouseEvent m)
{
x2 = m.getX();
y2 = m.getY();
repaint();
}
});
}

public void setType(int arg){
if(arg == 1){
type = 1;
}else if(arg == 2){
type = 2;
}
}

public void paintComponent(Graphics g)
{
super.paintComponent(g);
if(type == 1)
{
g.drawRect(x1,y1,x2,y2);
}
else if (type == 2)
{
g.drawOval(x1,y1,x2,y2);
}
}
}

1
ответ дан 13 октября 2011 в 08:10 Источник Поделиться