tenho uma classe View extendida da JFrame que possui um método paint, em uma outra classe EsperaJogada do meu projeto criei um novo método paint, porém quando chamo o repaint relativo ao paint da classe EsperaJogada que não é a extendida da JFrame não acontece o que eu esperava que seria a chamada para o paint da classe EsperaJogada, alguém pode me explicar o porquê?
O que é sua classe EsperaJoga?
Posta o código ai (resumido).
Até mais!
Anexa seu código aí. Assim ficou difícil.
Se EsperaJogada extender de JPanel ou outro componente, é melhor sobrescrever o paintComponent, não o paint.
E se você sobrescreveu o Paint do JFrame, você deve colocar super.paint(graphics) na primeia linha do método, para que ele faça um repaint normal, ou chamar o paint da classe esperaJogada diretamente.
Está tudo muito no ar, ponha os eu código em anexo para podermos te ajudar melhor.
ABAIXO ESTÁ O CÓDIGO
O problema é o seguinte se eu chamo o repaint relacionado ao paint da classe FrameG dentro do método mouseMoved da classe Esp
a malha de pinos fica piscando, já se eu faço como está abaixo criando um paint na classe Joga o chamando o repaint relacionado a ele no mouseMoved não acontece nada, e o que eu queria era que fosse chamado nesse caso com o repaint o paint da classe Joga o que evitaria da malha piscar, lembrando no meu projeto eu tenho que extender a classe FrameG de uma JFrame, esse código é só uma demonstração do meu projeto, outra coisa no paint da FrameG tem 3 linhas de código comentadas caso estejam ativas é que a malha fica piscando comentei para que vissem que quando chamo o repaint relativo ao paint de Joga nada acontece
[code] /*
- FrameG.java
- Created on December 4, 2007, 10:04 AM
*/
package View;
import Model.Esp;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
/**
*
-
@author root
*/
public class FrameG extends javax.swing.JFrame {private Graphics g;
Esp es;/** Creates new form FrameG */
public FrameG() {
initComponents();
es = new Esp(this);
g = getGraphics();}
public Esp getEsp(){
return es;
}
/** This method is called from within the constructor to
- initialize the form.
- WARNING: Do NOT modify this code. The content of this method is
- always regenerated by the Form Editor.
*/
public void paint(Graphics g) {
super.paint(g); malhaDePinos(g);
// Graphics2D g2d = (Graphics2D) g;
// g2d.setStroke(new BasicStroke(3.0f));
// g.drawLine(83, 103, es.xValor, es.yValor);
}
// <editor-fold defaultstate="collapsed" desc=" Generated Code ">
private void initComponents() {
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 400, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 300, Short.MAX_VALUE)
);
pack();
}// </editor-fold>
public void malhaDePinos(Graphics g){
int x = 80;
int y = 100;
int width = 8;
int heigth = 8;
//cria 2D convertendo g para Graphics2D
Graphics2D g2d = (Graphics2D) g.create();
for(int i=0; i<14; i++){
for(int j=0; j<14; j++){
g.setColor(Color.ORANGE);
g.fillRect(x,y,width,heigth);
x = x + 30;
}
y = y + 30;
x = 80;
}
g2d.dispose();
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new FrameG().setVisible(true);
}
});
}
// Variables declaration - do not modify
// End of variables declaration
}
/*
- Esp.java
- Created on December 4, 2007, 10:01 AM
- To change this template, choose Tools | Template Manager
- and open the template in the editor.
*/
package Model;
import View.FrameG;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
/**
*
-
@author root
*/
public class Esp extends Joga implements MouseMotionListener{public int xValor;
public int yValor;
private FrameG f;
/** Creates a new instance of Esp */
public Esp(FrameG frame) {f = frame; f.addMouseMotionListener(this);
}
public void mouseMoved(MouseEvent e){
xValor = e.getX(); yValor = e.getY(); //repaint referente ao paint da classe Joga repaint();
}
public void mouseDragged(MouseEvent e) {
}
}
/*
- Joga.java
- Created on December 10, 2007, 10:28 AM
- To change this template, choose Tools | Template Manager
- and open the template in the editor.
*/
package Model;
import View.FrameG;
import java.awt.Graphics;
import javax.swing.JPanel;
/**
*
-
@author root
*/
abstract public class Joga extends JPanel{FrameG frame;
Esp es;public void paint(Graphics g) {
es = frame.getEsp(); g.drawLine(83, 103, es.xValor, es.yValor);
}
}[/code]
Pode editar o código aí em cima e usar a tag code, fazendo o favor?
Se não sabe exatamente como fazer isso, dá uma lida aqui:
http://www.guj.com.br/posts/list/50115.java
Fica meio difícil ler assim.
Já deu para ver alguns problemas.
- A classe que extende JPanel deve sobrescrever paintComponent, não paint. Todos os componentes do swing que não são janelas sobrescrevem paintComponent.
- Faltou chamar super.paintComponent no início do método.
- Você nunca deve usar o objeto graphics diretamente. Alterar o estado desse objeto pode comprometer o funcionamento do Swing. Faça uma cópia do objeto no início do método e libere a sua cópia depois, dessa forma:
public void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g.create(); //Faz a cópia
//Trabalhe com g2d aqui
g2d.dispose();
}
Fiz as modificações mas elas não resolvem meu problema quando chamo o repaint no mouseMoved referente ao paintComponent nada acontece
Ok… você chamou o repaint da classe Joga. Mas Joga é um JPanel e, para que um JPanel seja pintado, ele deve ser adicionado ao JFrame.
Me parece que faltou uma linha como
getContentPane().add(esp);
No seu construtor (a linha vai ser um pouco diferente pq vc está usando GroupLayout e pq também falta dizer onde o painel será posicionado).
Entendi mas não sei como proceder tem como vc ser mais claro, esp que vc citou é o painel ou o que, e em que construtor devo fazer isso no de Joga? É que o problema é o seguinte na aplicação real eu criei o form no nettbeans, e na minha janela essa malha de pinos já está dentro de um painel que foi criado com o nettbeans e adcionado ao container do form
esp é o seu painel, da classe Esp, que é filha de Joga.
Voc6e deve adicionar o painel Esp no FrameG. E, até onde eu vi, você não fez isso. Você só deu um new e criou o painel, mas ele não foi efetivamente adicionado no JFrame.
jPanel3.add(painelD, java.awt.BorderLayout.CENTER);
Eu tenho um painel no meu form que é jPanel3, então adcionei meu painel que não havia adcionado ainda “painelD” ao painel criado com o nettbeans que já existia no form mas tá dando esse erro:
Exception in thread “main” java.lang.NullPointerException
mas não creio que é erro de nada que não está instanciado não
[quote=marcelabalbino]jPanel3.add(painelD, java.awt.BorderLayout.CENTER);
Eu tenho um painel no meu form que é jPanel3, então adcionei meu painel que não havia adcionado ainda “painelD” ao painel criado com o nettbeans que já existia no form mas tá dando esse erro:
Exception in thread “main” java.lang.NullPointerException
mas não creio que é erro de nada que não está instanciado não [/quote]
Esse erro só tem um significado. Alguma coisa não está instanciada.
Sugiro que você ponha um breakpoint na linha de comando onde ele ocorre e teste o que não está instanciado. Nem sempre é o componente que a gente desconfia.
Já consegui resolver todos os problemas e adicionar o painel que criei, obrigada pela ajuda
Parabéns!