Estou desenvolvendo um sistema com edição de imagens(bem básico).
Onde o cliente vai apenas fazer marcações sobre a imagem…
A parte de desenho livre(lapis) eu já fiz…
E o circulo está aparecendo porém só quando o botão do mouse é solto, pois se eu colocar no mousedragged fica uma coisa orrivel!
eu quero que de acordo com que o usuário movimento o mouse o circulo seja redimensionado, entendem?
importjava.awt.Color;importjava.awt.Graphics;importjava.awt.Graphics2D;importjava.awt.RenderingHints;importjava.awt.event.MouseAdapter;importjava.awt.event.MouseEvent;importjava.awt.event.MouseWheelEvent;importjava.awt.event.MouseWheelListener;importjava.awt.geom.Rectangle2D;importjavax.swing.JFrame;importjavax.swing.JPanel;publicclassDraw2DObjectsextendsJPanel{privateRectangle2D.FloatmyRect=newRectangle2D.Float(50,50,50,50);MovingAdapterma=newMovingAdapter();publicDraw2DObjects(){addMouseMotionListener(ma);addMouseListener(ma);addMouseWheelListener(newScaleHandler());}publicvoidpaint(Graphicsg){super.paint(g);Graphics2Dg2d=(Graphics2D)g;g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);g2d.setColor(newColor(0,0,200));g2d.fill(myRect);}classMovingAdapterextendsMouseAdapter{privateintx;privateinty;publicvoidmousePressed(MouseEvente){x=e.getX();y=e.getY();}publicvoidmouseDragged(MouseEvente){intdx=e.getX()-x;intdy=e.getY()-y;if(myRect.getBounds2D().contains(x,y)){myRect.x+=dx;myRect.y+=dy;repaint();}x+=dx;y+=dy;}}classScaleHandlerimplementsMouseWheelListener{publicvoidmouseWheelMoved(MouseWheelEvente){intx=e.getX();inty=e.getY();if(e.getScrollType()==MouseWheelEvent.WHEEL_UNIT_SCROLL){if(myRect.getBounds2D().contains(x,y)){floatamount=e.getWheelRotation()*5f;myRect.width+=amount;myRect.height+=amount;repaint();}}}}publicstaticvoidmain(String[]args){JFrameframe=newJFrame("Moving and Scaling");Draw2DObjectsm=newDraw2DObjects();m.setDoubleBuffered(true);frame.add(m);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(300,300);frame.setLocationRelativeTo(null);frame.setVisible(true);}}
Mas aii ele desenha um quadrado e eu queria um oval.
Eu estou criando um Array de Arcos pré-definidos(altura 0, largura 0, x = 0,…).
E de acordo com que o cliente vai “Draggando” o mouse as definições do arco vão sendo alteradas…
Mas desde já obrigado pela atenção de Todos.
Fiquem com DEUS:!:
landantas
Segue o Código Caso alguém esteja com este mesmo problema:
Arc2D.Floatcirculos[]=newArc2D.Float[30];//Cria uma Array dos arcosColorcores[]=newColor[30];//Cria uma Array com as cores dos arcosintforma=0;//indica qual o arco atual...for(inti=0;i<circulos.length;i++){circulos[i]=newArc2D.Float(Arc2D.OPEN);//Define os arcoscirculos[i].setAngleExtent(360);//Define a quantidade de graus que os arcos terãocirculos[i].setAngleStart(0);//Define em que angulo o arco irá começar a ser desenhadocores[i]=Color.black;//Define todas as cores como Preta}...publicvoidpaint(Graphicsg){//Sempre que for alterado a gráfica do componenteGraphics2Dg2d=(Graphics2D)g;g2d.setStroke(newBasicStroke(3));//Seta largura da linha dos circulosfor(inti=0;i<circulos.length;i++){g2d.setColor(cores[i]);//pega a cor do Arrayg2d.draw(circulos[i]);//Desenha a Borda dos Arcos}}...publicvoidmousePressed(MouseEventevt){//quando o mouse for pressionadoxx=evt.getX();//pega a posição x do mouseyy=evt.getY();//pega a posição y do mousecores[forma]=cor;//Seta a cor do arco atual}publicvoidmouseReleased(MouseEventevt){//Quando o botão do mouse for soltoforma++;//incrementa a forma}....publicvoidmouseDragged(MouseEventevt){//Agora Quando o mouse for "dragado"xx1=evt.getX();//pega o lugar x atual do mouseyy1=evt.getY();//pega o lugar y atual do mouseif(xx1>xx){if(yy1>yy){circulos[forma].setFrame(xx,yy,xx1-xx,yy1-yy);//Desenha o arcorepaint();//Atualiza a tela}else{circulos[forma].setFrame(xx,yy1,xx1-xx,yy-yy1);//Desenha o arcorepaint();//Atualiza a tela}}else{if(yy1>yy){circulos[forma].setFrame(xx1,yy,xx-xx1,yy1-yy);//Desenha o arcorepaint();//Atualiza a tela}else{circulos[forma].setFrame(xx1,yy1,xx-xx1,yy-yy1);//Desenha o arcorepaint();//Atualiza a tela}}}
Aii Galerinha!
Obrigado por ter dado atenção!!
Fiquem com DEUS:!:
InicianteJavaHenriqu
Boa :thumbup: ficou legal
landantas
Tank’s :thumbup:
ViniGodoy
Oi.
Cuidado, é uma das regras do Swing que você não deve modificar o estado do objeto Graphics recebido como parâmetro. Fazê-lo pode causar comportamente inconsistente na pintura de suas janelas.
Além disso, você deve sobrescrever o método paintComponent do JPanel, não o método paint.
Felizmente, é bem fácil modificar o código.
Troque de paint para paintComponent e, no inicio do método faça:
@Override
public void paintComponent(Graphics graphics) {
Graphics2D g = (Graphics2D)graphics.create(); //Cria uma cópia de graphics
//Trabalhe com a cópia
g.dispose(); //Libera o contexto gráfico
}
Copiar o contexto gráfico também é uma prática interessante, pois facilita muito o desenho.
Você pode criar conjuntos de funções que desenham objetos específico, sem a preocupação de como estará o Graphics após sua execução.