Eai Galera!
Seguinte... estou criando uma ferramenta de desenho livre.
Utilizo um JFrame com vários Labels e Jpanel dentro dele.
Em um desses Jpanel é o que vou fazer o desenho livre.
Mas quando tento utilizar o Graphics para desenhar, ele desenha em todo o JFrame, não somente dentro do JPanel que eu quero =/
Pesquisei muito e minha ultima alternativa foi pedir a ajuda de vocês.
Desde já agradeço!
Segue código abaixo (Estou fazendo com NetBeans):
publicclassPrincipalextendsjavax.swing.JFrame{intxvalue=-10,yvalue=-10;publicPrincipal(){super("Drag to paint");initComponents();}@Overridepublicvoidpaint(Graphicsg){//jPanel1.paint(g);g.fillOval(xvalue,yvalue,10,10);// desenha o ponto }privatevoidjPanel1MouseDragged(java.awt.event.MouseEventevt){xvalue=evt.getX()+10;// ponto na ponta do mouseyvalue=evt.getY()+28;repaint();}publicstaticvoidmain(Stringargs[]){java.awt.EventQueue.invokeLater(newRunnable(){publicvoidrun(){newPrincipal().setVisible(true);}});}}
ebeckemkamp uma solução seria vc colocar este código em uma classe estendida de um JPanel. E por fim add o objeto ao JFrame.
C
CarlosDukeJP
Salve,
Cara para você fazer isso você tem que sobrecarregar o metodo paint da classe JPanel e não da JFrame como você fez no seu codigo, como disse o urbgames.
Segue um exemplo para você dar uma olhada.
importjava.awt.Graphics;importjava.awt.Color;importjavax.swing.JPanel;importjava.awt.event.MouseMotionListener;importjava.awt.event.MouseEvent;publicclassPrincipalextendsjavax.swing.JFrame{intxvalue=-10,yvalue=-10;JPanelpnl;publicPrincipal(){super("Drag to paint");//initComponents(); setSize(500,500);setDefaultCloseOperation(DISPOSE_ON_CLOSE);setLayout(null);pnl=newJPanel(){publicvoidpaint(Graphicsg){g.setColor(Color.BLACK);g.fillOval(xvalue,yvalue,10,10);// desenha o ponto }};pnl.addMouseMotionListener(newMouseMotionListener(){publicvoidmouseDragged(MouseEvente){}publicvoidmouseMoved(MouseEventevt){xvalue=evt.getX();// ponto na ponta do mouseyvalue=evt.getY();pnl.repaint();}});pnl.setBounds(100,100,300,300);add(pnl);}@Overridepublicvoidpaint(Graphicsg){//jPanel1.paint(g);//g.setColor(Color.BLACK);//g.fillOval(xvalue, yvalue, 10, 10); // desenha o ponto }publicstaticvoidmain(Stringargs[]){java.awt.EventQueue.invokeLater(newRunnable(){publicvoidrun(){newPrincipal().setVisible(true);}});}}
Só esta acontecendo uma coisa que pretendo mudar:
Não consigo criar borda pra esse JPanel nem trocar de cor (background) o JPanel e o JFrame.
Tentei mudar o background do JPanel tanto na instanciação dele, no JFrame, como dentro de sua classe.
Caso saibam algo sobre, agradeço!
Segue código:
publicclassPrincipalextendsjavax.swing.JFrame{publicPrincipal(){super("Drag to paint");initComponents();setSize(800,600);setDefaultCloseOperation(DISPOSE_ON_CLOSE);setLayout(null);setBackground(Color.WHITE);Boarddraw=newBoard();draw.setSize(300,300);draw.setBackground(Color.WHITE);draw.setLocation(450,10);draw.setBorder(BorderFactory.createLineBorder(Color.BLACK,1));this.add(draw);draw.setVisible(true);}classBoardextendsJPanelimplementsMouseListener,MouseMotionListener{Pointpoint,prpoint;publicBoard(){point=null;prpoint=null;setBackground(Color.WHITE);this.addMouseListener(this);this.addMouseMotionListener(this);}@Overridepublicvoidpaint(Graphicsg){g.setColor(Color.BLACK);if(point!=null)g.fillOval(prpoint.x,prpoint.y,10,10);}@OverridepublicvoidmouseDragged(MouseEventme){prpoint=point;point=me.getPoint();repaint();}
E
entanglement
Em componentes Swing,
a) Não faça o override do método paint, e sim de paintComponent
b) Quando você faz o override de paintComponent, deve chamar super.paintComponent (g) como primeira instrução desse método.
Isso faz, por exemplo, a parte de:
Desenhar a borda
Setar a cor de fundo
Certo?
E
ebeckemkamp
Certo, entanglement.
O problema é que, setando background agora, ele não desenha mais no JPanel. O que acontece é que vai pintando só o ponto do mouse, não deixando setado o que já foi desenhado.
=/
e olha só…
Quero instanciar outro JPanel (que preciso por do lado desse). Ele instancia certinho mas, quando clico pra desenhar no JPanel de desenho, ele cria mais um JPanel dentro dele.
Cada solução está me levando a outros problemas… ^^
Agradeço toda a ajuda =D
M
Marky.Vasconcelos
Por isso é importante no seu método de desenho no JPanel chamar super.paint e guardar o estado dele.
Marky.Vasconcelos.
Fiz o chamado do super.paint (testei com superComponent tbm).
Mas como comentei, agora ele só desenha o ultimo clique e não a linha, como é o desejado (pois estou arrastando o mouse).
Parece que, quando eu arrasto, ele limpa a tela e desenha só o ponto do mouse.
Segue partes principais do codigo:
publicclassPrincipalextendsjavax.swing.JFrame{Geralg;Boarddraw;publicPrincipal(){super("Drag to paint");initComponents();setSize(800,600);draw=newBoard();draw.setSize(288,288);draw.setLocation(385,30);draw.setBorder(BorderFactory.createLineBorder(Color.BLACK,1));draw.setBackground(Color.WHITE);this.add(draw);}}classBoardextendsJPanelimplementsMouseListener,MouseMotionListener{Pointpoint,prpoint;publicBoard(){point=null;prpoint=null;this.addMouseListener(this);this.addMouseMotionListener(this);}@OverrideprotectedvoidpaintComponent(Graphicsg){super.paintComponent(g);Graphics2Dg2d=(Graphics2D)g.create();g2d.setColor(Color.BLACK);if(point!=null)g2d.fillOval(prpoint.x,prpoint.y,10,10);g2d.dispose();}@OverridepublicvoidmouseReleased(MouseEventme){point=null;}@OverridepublicvoidmouseDragged(MouseEventme){Xt=this.getWidth();Yt=this.getHeight();repaint();prpoint=point;point=me.getPoint();}@OverridepublicvoidmousePressed(MouseEventme){point=me.getPoint();}}
E
entanglement
Eu aconselharia você a ler vários artigos do blog do Vinigodoy (www.pontov.com.br se não me engano).
É que, para fazer um programa desse tipo (como se fosse um “paint”), é necessário usar um BufferedGraphics auxiliar, ou então você criar uma coleção dos pontos que você já desenhou na tela. Do jeito que você escreveu o programa, você só vai conseguir mostrar o último ponto desenhado mesmo, já que, por definição, o Graphics correspondente a um componente visual na tela não é “persistente” e qualquer coisa pode apagá-lo devido a qualquer redesenho que você venha ter a fazer.
Como é que se faz isso? Leia os artigos do blog em vez de ficar fazendo as coisas “na unha”. Sem ler antes você não vai chegar a lugar nenhum.
E
ebeckemkamp
Certo!
Vou ver isso!
Muito aobrigado pela ajuda de vcs!
Deram uma baita mão. Consegui resolver vários problemas.
Té mais
M
Marky.Vasconcelos
Siga a dica do entanglement e leia os tutoriais de Java2D no PontoV.
Voce precisa guardar os pontos para desenhar a tela novamente a cada iteração.