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):
[code]public class Principal extends javax.swing.JFrame {
int xvalue = -10, yvalue = -10;
public Principal() {
super("Drag to paint");
initComponents();
}
@Override
public void paint ( Graphics g ){
//jPanel1.paint(g);
g.fillOval(xvalue, yvalue, 10, 10); // desenha o ponto
}
private void jPanel1MouseDragged(java.awt.event.MouseEvent evt) {
xvalue = evt.getX()+10; // ponto na ponta do mouse
yvalue = evt.getY()+28;
repaint();
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Principal().setVisible(true);
}
});
}
}[/code]
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.
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.
[code]import java.awt.Graphics;
import java.awt.Color;
import javax.swing.JPanel;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseEvent;
public class Principal extends javax.swing.JFrame {
int xvalue = -10, yvalue = -10;
JPanel pnl;
public Principal() {
super("Drag to paint");
//initComponents();
setSize(500,500);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setLayout(null);
pnl = new JPanel(){
public void paint(Graphics g){
g.setColor(Color.BLACK);
g.fillOval(xvalue, yvalue, 10, 10); // desenha o ponto
}
};
pnl.addMouseMotionListener(new MouseMotionListener(){
public void mouseDragged(MouseEvent e) {}
public void mouseMoved(MouseEvent evt) {
xvalue = evt.getX(); // ponto na ponta do mouse
yvalue = evt.getY();
pnl.repaint();
}
});
pnl.setBounds(100,100,300,300);
add(pnl);
}
@Override
public void paint ( Graphics g ){
//jPanel1.paint(g);
//g.setColor(Color.BLACK);
//g.fillOval(xvalue, yvalue, 10, 10); // desenha o ponto
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Principal().setVisible(true);
}
});
}
}[/code]
Show de bola, galera!
Obrigado pela ajuda!
Deu certinho como eu queria!
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:
[code]public class Principal extends javax.swing.JFrame {
public Principal() {
super(“Drag to paint”);
initComponents();
setSize(800, 600);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setLayout(null);
setBackground(Color.WHITE);
Board draw=new Board();
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);
}
class Board extends JPanel implements MouseListener,MouseMotionListener {
Point point,prpoint;
public Board() {
point=null;
prpoint=null;
setBackground(Color.WHITE);
this.addMouseListener(this);
this.addMouseMotionListener(this);
}
@Override
public void paint(Graphics g) {
g.setColor(Color.BLACK);
if(point!=null)
g.fillOval(prpoint.x, prpoint.y, 10, 10);
}
@Override
public void mouseDragged(MouseEvent me) {
prpoint=point;
point=me.getPoint();
repaint();
}
[/code]
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?
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
Por isso é importante no seu método de desenho no JPanel chamar super.paint e guardar o estado dele.
@Override
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setColor(Color.BLACK);
if(point!=null)
g2d.fillOval(prpoint.x, prpoint.y, 10, 10);
g2d.dispose();
}
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:
[code]public class Principal extends javax.swing.JFrame {
Geral g;
Board draw;
public Principal() {
super(“Drag to paint”);
initComponents();
setSize(800, 600);
draw=new Board();
draw.setSize(288, 288);
draw.setLocation(385, 30);
draw.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
draw.setBackground(Color.WHITE);
this.add(draw);
}
}
class Board extends JPanel implements MouseListener,MouseMotionListener {
Point point,prpoint;
public Board() {
point=null;
prpoint=null;
this.addMouseListener(this);
this.addMouseMotionListener(this);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent (g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setColor(Color.BLACK);
if(point!=null)
g2d.fillOval(prpoint.x, prpoint.y, 10, 10);
g2d.dispose();
}
@Override
public void mouseReleased(MouseEvent me) {
point=null;
}
@Override
public void mouseDragged(MouseEvent me) {
Xt = this.getWidth();
Yt = this.getHeight();
repaint();
prpoint=point;
point=me.getPoint();
}
@Override
public void mousePressed(MouseEvent me) {
point=me.getPoint();
}
}[/code]
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.
Certo!
Vou ver isso!
Muito aobrigado pela ajuda de vcs!
Deram uma baita mão. Consegui resolver vários problemas.
Té mais
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.