Имеем программку... код:
| Код | import java.awt.*; import java.awt.event.*; import java.awt.image.*;
class SimpleFrame extends Frame{ //По этим точкам рисуется овал private int prsdX, prsdY, lastX, lastY; //На нем "держится" двойная буфферизация - так я избавился от мерцания private BufferedImage bi = new BufferedImage(640,480,BufferedImage.TYPE_INT_ARGB); //Сюда сохраняется текущее изображение, перед тем, как рисовать новый овал //Необходимо, чтобы при перетягивании мышью нового овала, старое изображение не стиралось private BufferedImage tmp = new BufferedImage(640,480,BufferedImage.TYPE_INT_ARGB); Button bRed, bGreen, bBlue, bBlack, bWhite; Checkbox chb; //Будет ли овал с заливкой или без private boolean unfilled=true; //Цвет овала private Color color = Color.black;
//Ловим события мыши class MyMouseAdapter implements MouseListener{ public void mouseClicked(MouseEvent ev) { //Если уликнута одна из кнопок - меняем цвет if (ev.getComponent().equals(bBlack)) color = Color.BLACK; if (ev.getComponent().equals(bWhite)) color = Color.WHITE; if (ev.getComponent().equals(bRed)) color = Color.RED; if (ev.getComponent().equals(bGreen)) color = Color.GREEN; if (ev.getComponent().equals(bBlue)) color = Color.BLUE; if (ev.getComponent().equals(chb)) unfilled=!chb.getState(); } public void mouseEntered(MouseEvent arg0) {} public void mouseExited(MouseEvent arg0) {} public void mousePressed(MouseEvent ev) { //Устанавливаем координаты для рисования "временных" овалов prsdX=ev.getX()-4; prsdY=ev.getY()-30; //"Сохраняем" имеющееся изображение tmp.getGraphics().fillRect(0, 0, 640, 480); tmp.getGraphics().drawImage(bi, 0, 0, null); } public void mouseReleased(MouseEvent arg0) {} } //Ловим движение мыши class MyMouseMotionAdapter implements MouseMotionListener{ public void mouseDragged(MouseEvent ev) { Graphics big = bi.getGraphics(); //Рисуем сохраненное изображение //Тем самым стирается временно нарисованный овал big.drawImage(tmp, 0, 0, null); lastX=ev.getX()-4; lastY=ev.getY()-30; big.setColor(color); if (unfilled) big.drawOval(Math.min( prsdX, lastX), Math.min( prsdY, lastY), Math.abs(prsdX-lastX), Math.abs(prsdY-lastY)); else big.fillOval(Math.min( prsdX, lastX), Math.min( prsdY, lastY), Math.abs(prsdX-lastX), Math.abs(prsdY-lastY)); Graphics g = getGraphics(); g.drawImage(bi, 4, 30, null); } public void mouseMoved(MouseEvent ev) {} } SimpleFrame(String s){ super (s); setSize(648, 534); setResizable(false); this.setLocation(100, 100); setVisible(true); addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent ev){ System.exit (0); } }); addMouseListener(new MyMouseAdapter()); addMouseMotionListener(new MyMouseMotionAdapter()); tmp.getGraphics().setColor(Color.white); bRed = new Button("Red"); bGreen = new Button("Green"); bBlue = new Button("Blue"); bBlack = new Button("Black"); bWhite = new Button("White"); chb = new Checkbox("Filled"); bBlack.addMouseListener(new MyMouseAdapter()); bWhite.addMouseListener(new MyMouseAdapter()); bRed.addMouseListener(new MyMouseAdapter()); bGreen.addMouseListener(new MyMouseAdapter()); bBlue.addMouseListener(new MyMouseAdapter()); chb.addMouseListener(new MyMouseAdapter()); Panel p = new Panel(); add(p, BorderLayout.SOUTH); p.add(bBlack); p.add(bWhite); p.add(bRed); p.add(bGreen); p.add(bBlue); p.add(chb); p.setVisible(true); } public void paint(Graphics gr){} public static void main(String[] args){ Frame fr = new SimpleFrame(" Моя программа"); } }
|
Программка делает то, что делает, никаких других функций и наворотов.
Прошу оценить корявость реализации. Скажем, по шкале от 1 до 10 (1 - фигня, 10 - шедевръ)
ЗЫ: почемуто-иногда не прорисовываются некоторые кнопки. никак не могу понять, почему. |