Duvia quanto a procedimento de REPAINT() neste programa de plano cartesiano

8 respostas
erickb

Boa tarde!

estou com uma duvida quanto ao programa que irei aprensentar abaixo, desenvolvi um sisitema para ligar pontos ao sistema cartesiano, entre 10 a -10 em x e Y gostaria de chamar um evento no jbutton para que quando o usuaario entrar com os dados e clicar no botao ele crie um evento para chamar a os pontos e ligar com o novo paramentro dado, alguem pode me ajudar

package TrabPc;
 import java.awt.BasicStroke; 
 import java.awt.BorderLayout; 
 import java.awt.Color; 
 import java.awt.Graphics; 
 import java.awt.Graphics2D; 
 import java.awt.RenderingHints;   
 import javax.swing.JComponent; 
 import javax.swing.JFrame; 
 import javax.swing.JLabel;
 import javax.swing.JPanel;
 import java.text.ParseException;
 import javax.swing.JButton;
 import java.awt.event.ActionEvent; 
 import java.awt.event.ActionListener; 
 import java.awt.event.FocusEvent; 
 import java.awt.event.FocusListener;
 import javax.swing.JFormattedTextField;
 import javax.swing.text.MaskFormatter;

 
 


public class TrabPc extends JComponent implements ActionListener{
   
   int px = 0;
   int py = 0;

 private static final BasicStroke STROKE_FINO = new BasicStroke(0.1f); 
 
 JFormattedTextField edtx = new JFormattedTextField();
 JFormattedTextField edty = new JFormattedTextField();
 private JPanel p = new JPanel();
 private JPanel quadro = new JPanel();
 public JFrame f = new JFrame("Plano Cartesiano");
 private JLabel lbl = new JLabel("Valor Eixo X: ");
 private JLabel lbl2 = new JLabel("Valor eixo Y: ");
 private JButton btn = new JButton("Mostrar pontos");
 public  int eixoX[] = new int[20];
 public  int eixoY[] = new int[20];
 
 

 
 
  public void paintComponent(Graphics g) {
        
         //opcoes do traço 
         //g.setStroke(STROKE_FINO); 
         g.setColor(Color.BLACK); 
       //  g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
  
         //XOR só pra aparecer melhor 
         g.setXORMode(Color.white);
         //Eixo X
         g.drawLine(20, 287, 565, 287); 
         //Eixo Y
         g.drawLine(293,80, 293, 540); 
        
         g.setPaintMode(); 
        
         //Definindo pontos para o plano cartesiano
         int ptsX = 560;
         int ptsY = 540;
         for (int xcont=0 ; xcont<20 ; xcont++){
             eixoX[xcont] = ptsX;
             eixoY[xcont] = ptsY;
             ptsX -=28;
             ptsY -=24;
             g.drawLine(eixoX[xcont], 285, eixoX[xcont], 290);
             g.drawLine(292, eixoY[xcont], 297, eixoY[xcont]);
             
          //Ligando ao ponto Y
         g.drawLine(eixoX[px],287,eixoX[px], eixoY[py]);
         //Ligando ao ponto X
         g.drawLine(eixoX[px], eixoY[py], 293,eixoY[py]);
         //desenhndo Elipse de encontro dos pontos
         g.fillOval(eixoX[px]-2, eixoY[py]-2, 5, 5);
         } 
  }         

 
 
             
 


 
 private void MontaForm()throws ParseException{
  
   
   TrabPc form = new TrabPc();
 
   quadro.add(form) ;
   quadro.repaint();
   btn.addActionListener(this);     
   edtx.setColumns(3);
   edty.setColumns(3);
   p.setSize(600, 50);
   p.setBackground(Color.WHITE);
   p.add(lbl);
   p.add(edtx);
   p.add(lbl2);
   p.add(edty);
   p.add(btn);
   f.getContentPane().setLayout(new BorderLayout());
   f.getContentPane().add(p);
   f.getContentPane().add(form, BorderLayout.CENTER);
   f.pack();
   f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);
   f.setVisible(true);
   f.setSize(600, 600);
  
 }

 
   
 public void actionPerformed(ActionEvent e) {          
       px = Integer.parseInt(edtx.getText()) ;  
       py = Integer.parseInt(edty.getText()) ;  
       repaint(); 
      }  
    


 public static void main(String[]args)throws ParseException{
    new TrabPc().MontaForm();
 }
 

 
 }

o mais dificil ja foi feito q é o desenvolvimento do algoritimo como nao sou mto bom em java gostaria de saber como chamar os eventos e o uso destes metodos como o repaint() etc.

8 Respostas

ViniGodoy

Qual é a sua dúvida, exatamente? Você já está usando o actionListener, já chama repaint e já sobrescreve paintComponent.
Dá uma olhada nesse tutorial:
http://java.sun.com/products/jfc/tsc/articles/painting/index.html#swing

E nesse aqui também:
http://java.sun.com/j2se/1.5.0/docs/guide/2d/spec/j2d-bookTOC.html

Outra coisa, você não pode alterar as cores e o estado do objeto graphics recebido no parâmetro. Faça uma cópia dele usando o método create:
@Override
public void paintComponent(Graphics graphics) {   
   //Faz a cópia
   Graphics2D g = (Graphics2D) graphics.create();

   //O resto do seu método vai aqui

   //Libera a cópia
   g.dispose();
}
erickb

eu quero que, quando o usuario digita dois pontos entre dez negativo e dez positivo ele gere os pontos no plano cartesiano quando clicar no Jbutton deu pra pegar a ideia?

cheguei a ler o que voce me passou sobre a diferença de repaint entre o swing e AWT. mas sou leigo em java, gostaria que pudessem me excalresser esta duvida.

erickb

erickb:
eu quero que, quando o usuario digita dois pontos entre dez negativo e dez positivo ele gere os pontos no plano cartesiano quando clicar no Jbutton deu pra pegar a ideia? e o problema é que mesmo quando eu clicco no botao ele nao usa o repaint com os parametros que serao atualizados. se voce cehgar a compilar o programa ira entender melhor o procedimento.

cheguei a ler o que voce me passou sobre a diferença de repaint entre o swing e AWT. mas sou leigo em java, gostaria que pudessem me excalresser esta duvida.

erickb

alguem pode me dar uma luz por favor! desculpe o flood

ivo_costa

Eu dei uma mechida no código, tá desenhando uma linha na tela, mas não nos pontos corretos, cabe a ti agora a pensar como arrumar isso:
Boa sorte!

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.text.ParseException;
import javax.swing.JButton;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFormattedTextField;

public class Teste extends JComponent implements ActionListener {

	int px = 0;
	int py = 0;

	private static final BasicStroke STROKE_FINO = new BasicStroke(0.1f);

	JFormattedTextField edtx = new JFormattedTextField();
	JFormattedTextField edty = new JFormattedTextField();
	private Teste form;
	private JPanel p = new JPanel();
	private JPanel quadro = new JPanel();
	public JFrame f = new JFrame("Plano Cartesiano");
	private JLabel lbl = new JLabel("Valor Eixo X: ");
	private JLabel lbl2 = new JLabel("Valor eixo Y: ");
	private JButton btn = new JButton("Mostrar pontos");
	public int eixoX[] = new int[20];
	public int eixoY[] = new int[20];

	public void paintComponent(Graphics graphics) {
		Graphics2D g = (Graphics2D) graphics.create();  
		
		// opcoes do traço
		// g.setStroke(STROKE_FINO);
		g.setColor(Color.BLACK);
		// g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
		// RenderingHints.VALUE_ANTIALIAS_ON);

		// XOR só pra aparecer melhor
		g.setXORMode(Color.white);
		// Eixo X
		g.drawLine(20, 287, 565, 287);
		// Eixo Y
		g.drawLine(293, 80, 293, 540);

		g.setPaintMode();

		// Definindo pontos para o plano cartesiano
		int ptsX = 560;
		int ptsY = 540;
		for (int xcont = 0; xcont < 20; xcont++) {
			eixoX[xcont] = ptsX;
			eixoY[xcont] = ptsY;
			ptsX -= 28;
			ptsY -= 24;
			g.drawLine(eixoX[xcont], 285, eixoX[xcont], 290);
			g.drawLine(292, eixoY[xcont], 297, eixoY[xcont]);

			// Ligando ao ponto Y
			g.drawLine(eixoX[px], 287, eixoX[px], eixoY[py]);
			// Ligando ao ponto X
			g.drawLine(eixoX[px], eixoY[py], 293, eixoY[py]);
			// desenhndo Elipse de encontro dos pontos
			g.fillOval(eixoX[px] - 2, eixoY[py] - 2, 5, 5);
		}
		
		g.dispose();
	}

	private void MontaForm() throws ParseException {
		form = new Teste();
		
		quadro.add(form);
		btn.addActionListener(this);
		edtx.setColumns(3);
		edty.setColumns(3);
		p.setSize(600, 50);
		p.setBackground(Color.WHITE);
		p.add(lbl);
		p.add(edtx);
		p.add(lbl2);
		p.add(edty);
		p.add(btn);
		f.getContentPane().setLayout(new BorderLayout());
		f.getContentPane().add(p);
		f.getContentPane().add(form, BorderLayout.CENTER);
		f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);
		f.setVisible(true);
		f.setSize(600, 600);
		f.repaint();
		f.validate();
		f.setLocationRelativeTo(null);
	}

	public void actionPerformed(ActionEvent e) {
		px = Integer.parseInt(edtx.getText());
		py = Integer.parseInt(edty.getText());
		
		Graphics2D g = (Graphics2D) form.getGraphics();
		g.drawLine(px, py, 270, 250);
		g.dispose();
	}

	public static void main(String[] args) throws ParseException {
		new Teste().MontaForm();
	}

}
erickb

kra acho q nao deu mto certo nao to vendo a classe awt para os componentes dexo o programa meio estranho.

ivo_costa

Como? Esse programa que eu te mandei compila e executa, o único problema é que as linhas não estão sendo colocadas no lugar correto do plano cartesiano, vc vai ter que achar o número ideal para somar ao número que o usuário colocar nos fields.

Se o seu programa não está compilando talvez seja porcausa do nome da classe que eu mudei de TrabPc para Teste. Volte o nome para TrabPc ou renomeie o arquivo para Teste.java

erickb
package TrabPc;
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.text.ParseException;
import javax.swing.JButton;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFormattedTextField;

public class TrabPc extends JComponent implements ActionListener {

	int px = 0;
	int py = 0;

	private static final BasicStroke STROKE_FINO = new BasicStroke(0.1f);

	JFormattedTextField edtx = new JFormattedTextField();
	JFormattedTextField edty = new JFormattedTextField();
	private TrabPc form;
	private JPanel p = new JPanel();
	private JPanel quadro = new JPanel();
	public JFrame f = new JFrame("Plano Cartesiano");
	private JLabel lbl = new JLabel("Valor Eixo X: ");
	private JLabel lbl2 = new JLabel("Valor eixo Y: ");
	private JButton btn = new JButton("Mostrar pontos");
	final  public int eixoX[] = new int[20];
	final public int eixoY[] = new int[20];

	public void paintComponent(Graphics graphics) {
		Graphics2D g = (Graphics2D) graphics.create();  
		
		// opcoes do traço
		// g.setStroke(STROKE_FINO);
		g.setColor(Color.BLACK);
		// g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
		// RenderingHints.VALUE_ANTIALIAS_ON);

		// XOR só pra aparecer melhor
		g.setXORMode(Color.white);
		// Eixo X
		g.drawLine(20, 287, 565, 287);
		// Eixo Y
		g.drawLine(293, 80, 293, 540);

		g.setPaintMode();

		// Definindo pontos para o plano cartesiano
		int ptsX = 560;
		int ptsY = 540;
		for (int xcont = 0; xcont < 20; xcont++) {
			eixoX[xcont] = ptsX;
			eixoY[xcont] = ptsY;
			ptsX -= 28;
			ptsY -= 24;
			g.drawLine(eixoX[xcont], 285, eixoX[xcont], 290);
			g.drawLine(292, eixoY[xcont], 297, eixoY[xcont]);


		}
		
		g.dispose();
	}

	private void MontaForm() throws ParseException {
		form = new TrabPc();
		
		quadro.add(form);
		btn.addActionListener(this);
		edtx.setColumns(3);
		edty.setColumns(3);
		p.setSize(600, 50);
		p.setBackground(Color.WHITE);
		p.add(lbl);
		p.add(edtx);
		p.add(lbl2);
		p.add(edty);
		p.add(btn);
		f.getContentPane().setLayout(new BorderLayout());
		f.getContentPane().add(p);
		f.getContentPane().add(form, BorderLayout.CENTER);
		f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);
		f.setVisible(true);
		f.setSize(600, 600);
		//f.repaint();
		f.validate();
		f.setLocationRelativeTo(null);
	}

	public void actionPerformed(ActionEvent e) {
		px = Integer.parseInt(edtx.getText());
		py = Integer.parseInt(edty.getText());
		//repaint();
		Graphics2D g = (Graphics2D) form.getGraphics();
		// Ligando ao ponto Y
		g.drawLine(eixoX[px], 287, eixoX[px], eixoY[py]);
	        // Ligando ao ponto X
		g.drawLine(eixoX[px], eixoY[py], 293, eixoY[py]);
		// desenhndo Elipse de encontro dos pontos
		g.fillOval(eixoX[px] - 2, eixoY[py] - 2, 5, 5);
		g.dispose();
	}

	public static void main(String[] args) throws ParseException {
		new TrabPc().MontaForm();
	}

}

ehhe realmente e uma idiotice minha ahah rodou legal tenta interpretar o que eu fiz, no metodo que esta no action listener misteriosamente os arrays q sao constantes recebem o valor zero! nao sei como sendo que elas sao atribuidas antes! da uma olhada ae e obrigadaooo!! pela ideia!

Criado 2 de setembro de 2008
Ultima resposta 3 de set. de 2008
Respostas 8
Participantes 3