Desenho de linha com drawLine() dentro de uma TextArea após ter pressionado um JButton [Resolvido]

Pessoal,

Alguns pepinos foram ficando para trás. Agora preciso que o meu bimput (JButton) após pressionado desenhe uma linha com drawLine() dentro de uma TextArea.
No meu pgm tenho o método Paint que desenha o triangulo incialmente, mas depois como preciso desenhar as linhas cortando o triangulo então declarei localmente a variavel g da Classe Graphics para poder chamar o método g.drawLine(); porém dá erro e abortar.
Vou postar somente as partes que interessam okei?!
Este é o triangulo desenhado dentro da TextArea

private class MyTextArea extends JTextArea {  
        
        public MyTextArea(int rows, int columns) {  
            super(rows, columns);  
        }  
  
        public void paint(Graphics g) {  
  
        	 super.paint(g);  
        	   
             // Metade horizontal e metade vertical  
             int meioHor = 195;  
             int meioVer = 235;  
       
             // Desenha o triangulo na parte inferior da janela da JTextArea  
       
             g.setColor(Color.red); // lado esquerdo  
             g.drawLine(meioHor, meioVer, 30, 471 - 30);  
             g.setColor(Color.black);
             g.drawString(svertice1, 170, 222);
       
             g.setColor(Color.green);  
             g.drawLine(30, 471 - 30, 390 - 30, 471 - 30);// base do triangulo  
             g.setColor(Color.black);  
             g.drawString(svertice2, 12, 454);
       
             g.setColor(Color.blue); // lado direito  
             g.drawLine(meioHor, meioVer, 390 - 30, 471 - 30);  
             g.setColor(Color.black);
             g.drawString(svertice3, 350, 454);
        
  
        }
    	

    }  

Agora o actionPerformed com o JButton

  public void actionPerformed(ActionEvent ev) {
		Object src = ev.getSource();
		final int TOTCOAL1 = 1, TOTCOAL2 = 0, TOTCOAL3 = 1;
		final int TOTCOALIZAO = 8;
		final int TOT12 = 4, TOT13 = 3, TOT23 = 5;


if (src == bimput) {
			// primeiro valor constante
			int somaA = -1;
			int opa = listaA.getSelectedIndex();
			somaA = opa + TOTCOAL1;
			String sla = String.valueOf(opa);
			int difA = TOTCOALIZAO - somaA;
						
			String txt12Z = String.valueOf(difA);
			tpos12_Z.setHorizontalAlignment((int) JComponent.CENTER_ALIGNMENT);
			tpos12_Z.setAlignmentX(JComponent.CENTER_ALIGNMENT);
			tpos12_Z.setEditable(false);
			tpos12_Z.setText(txt12Z);
							
			String output = "\nValor da SomaA: " + somaA  + "\tDifA: " + difA + "\ttpos12_Z: " + tpos12_Z.getText();
			///////////////////////////////////////////////////
			int somaB = -1;
			int opb = listaB.getSelectedIndex() + 1;
			String slb = String.valueOf(opb);
			somaB = opb + TOTCOAL2;
			int difB = TOTCOALIZAO - somaB;
			// segundo valor constante
			String txt21Z = String.valueOf(difB);
			tpos21_Z.setHorizontalAlignment((int) JComponent.CENTER_ALIGNMENT);
			tpos21_Z.setAlignmentX(JComponent.CENTER_ALIGNMENT);
			tpos21_Z.setEditable(false);
			tpos21_Z.setText(txt21Z);
			
			output += "\nValor da SomaB: " + somaB  + "\tDifB: " + difB + "\ttpos21_Z: " + tpos21_Z.getText();
			
		    //////////////////////////////////////////////////////
			// primeiro valor constante
			int somaC = -1;
			int opc = listaC.getSelectedIndex();
			somaC = opc + TOTCOAL3;
			String slc = String.valueOf(opc);
			int difC = TOTCOALIZAO - somaC;
						
			String txt13X = String.valueOf(difC);
			tpos13_Z.setHorizontalAlignment((int) JComponent.CENTER_ALIGNMENT);
			tpos13_Z.setAlignmentX(JComponent.CENTER_ALIGNMENT);
			tpos13_Z.setEditable(false);
			tpos13_Z.setText(txt13X);
			
			output += "\nValor da SomaC: " + somaC  + "\tDifA: " + difC + "\ttpos13_Z: " + tpos13_Z.getText();
			///////////////////////////////////////////////////
			int somaD = -1;
			int opd = listaD.getSelectedIndex() + 1;
			String sld = String.valueOf(opd);
			somaD = opd + TOTCOAL3;
			int difD = TOTCOALIZAO - somaD;
			
			String txt31Y = String.valueOf(difD);
			// terceiro valor constante
			tpos31_Y.setHorizontalAlignment((int) JComponent.CENTER_ALIGNMENT);
			tpos31_Y.setAlignmentX(JComponent.CENTER_ALIGNMENT);
			tpos31_Y.setEditable(false);
			tpos31_Y.setText(txt31Y);
			
			output += "\nValor da SomaD: " + somaD  + "\tDifD: " + difD + "\ttpos31_Y: " + tpos31_Y.getText();
			//////////////////////////////////////////////////////
			int somaE = -1;
			int ope = listaE.getSelectedIndex() + 1;
			String sle = String.valueOf(ope);
			somaE = ope + TOTCOAL2;
			int difE = TOTCOALIZAO - somaE;
			
			String txt23X = String.valueOf(difE);
			// segundo valor constante
			tpos23_Z.setHorizontalAlignment((int) JComponent.CENTER_ALIGNMENT);
			tpos23_Z.setAlignmentX(JComponent.CENTER_ALIGNMENT);
			tpos23_Z.setEditable(false);
			tpos23_Z.setText(txt23X);
			
			output += "\nValor da SomaE: " + somaE  + "\tDifE: " + difE + "\ttpos23_Z (calculado): " + tpos23_Z.getText();
			//////////////////////////////////////////////////////
			int somaF = -1;
			int opf = listaF.getSelectedIndex();
			String slf = String.valueOf(opf);
			somaF = opf + TOTCOAL3;
			int difF = TOTCOALIZAO - somaF;
			
			String txt32Y = String.valueOf(difF);
			// segundo valor constante
			tpos32_X.setHorizontalAlignment((int) JComponent.CENTER_ALIGNMENT);
			tpos32_X.setAlignmentX(JComponent.CENTER_ALIGNMENT);
			tpos32_X.setEditable(false);
			tpos32_X.setText(txt32Y);
						
			output += "\nValor da SomaF: " + somaF  + "\tDifF: " + difF + "\ttpos32_X (calculado): " + tpos32_X.getText();
			tareadesenho2.setText(output);
						
			Font negrito = new Font("SansSerif", Font.BOLD, 14);
			JTextArea outputArea = new JTextArea(8, 25);
			JScrollPane scroller = new JScrollPane(outputArea);
			String output3 = "";
			
			if ((somaA > TOT12) || (somaB > TOT12) || (somaC > TOT13) || (somaD > TOT13) || (somaE > TOT23) || (somaF > TOT23))
			{
				
				output3 += "ATENÇÃO - Violação de Restrição" +
						"\nExcedido o valor da função característica!!!"   +
						"\nRedefina coordenadas válidas levando em"  +
						"\nconsideração o conceito de superaditividade e " +
						"\nde conjunto vazio" ;
				outputArea.setFont(negrito);
				outputArea.setText(output3);
				JOptionPane.showMessageDialog(null, outputArea, 
				"Explicação do Jogo", JOptionPane.INFORMATION_MESSAGE);
				tpos12_Z.setText("");
			}
			return;
		}

PS.: Espero não assustar com o tanto de variavel aqui, mas faz parte da lógica, o que preciso é logo após o ultimo String output poder desenhar ao menos uma linha cortando o triangulo da TextArea.

Obrigada sempre!
sds

Sinceramente não entendi o que você quis fazer pois vc não colocou o contexto que você está trabalhando. Se o problema está relacionado ao desenho, veja as dicas a seguir:

Quer desenhar? Use um JPanel ao invés de um JTextArea.
Sobrescreva o método paintComponent do seu JPanel e não esqueça da chamada super.paintComponent(g) como primeira instrução do método.
Quer desenhar Strings? Use o método drawString de Graphics.

[]´s

Segue o exemplo como vc pediu. Por favor, vamos discutir pelo fórum e não por mensagens privadas.

Triangulo.java

[code]import java.awt.*;

/**
*

  • @author David Buzatto
    */
    public class Triangulo {

    private Point vertice1;
    private Point vertice2;
    private Point vertice3;
    private Color corLado1;
    private Color corLado2;
    private Color corLado3;
    private Color corLabels;

    public Triangulo() {
    vertice1 = new Point();
    vertice2 = new Point();
    vertice3 = new Point();
    corLado1 = Color.RED;
    corLado2 = Color.GREEN;
    corLado3 = Color.BLUE;
    corLabels = Color.BLACK;
    }

    public void setCorLado1( Color corLado1 ) {
    this.corLado1 = corLado1;
    }

    public void setCorLado2( Color corLado2 ) {
    this.corLado2 = corLado2;
    }

    public void setCorLado3( Color corLado3 ) {
    this.corLado3 = corLado3;
    }

    public void setCorLabels( Color corLabels ) {
    this.corLabels = corLabels;
    }

    public Point getVertice1() {
    return vertice1;
    }

    public Point getVertice2() {
    return vertice2;
    }

    public Point getVertice3() {
    return vertice3;
    }

    public void paintMe( Graphics g ) {

     g.setColor( corLado1 );
     g.drawLine( vertice1.x, vertice1.y, vertice2.x, vertice2.y );
    
     g.setColor( corLado2 );
     g.drawLine( vertice2.x, vertice2.y, vertice3.x, vertice3.y );
    
     g.setColor( corLado3 );
     g.drawLine( vertice3.x, vertice3.y, vertice1.x, vertice1.y );
    
     g.setColor( corLabels );
     g.drawString( gerarLabel( vertice1 ), vertice1.x, vertice1.y + 15 );
     g.drawString( gerarLabel( vertice2 ), vertice2.x, vertice2.y + 15 );
     g.drawString( gerarLabel( vertice3 ), vertice3.x, vertice3.y - 10 );
    

    }

    private String gerarLabel( Point ponto ) {
    return ponto.x + ", " + ponto.y;
    }

}[/code]

PainelTriangulo.java

[code]import java.awt.;
import javax.swing.
;

/**
*

  • @author David Buzatto
    */
    public class PainelTriangulo extends JPanel {

    private Triangulo triangulo;

    public PainelTriangulo() {
    triangulo = new Triangulo();
    }

    @Override
    protected void paintComponent( Graphics g ) {

     super.paintComponent( g );
    
     g.setColor( Color.WHITE );
     g.fillRect( 0, 0, getWidth(), getHeight() );
    
     Point centro = new Point( getWidth() / 2, getHeight() / 2 );
     int margem = 30;
    
     /* 
      * Cria os vérticas com base na largura e altura do painel e a 
      * margem estipulada.
      * 
      * A mudança da posição dos vértices pode ser feita por fora do painel, 
      * acessando o triangulo pelo método getTriangulo.
      * Se assim desejar, as instruções de mudança dos vértices devem ser 
      * tiradas daqui.
      */
     triangulo.getVertice1().setLocation( margem, getHeight() - margem );
     triangulo.getVertice2().setLocation( getWidth() - margem, getHeight() - margem );
     triangulo.getVertice3().setLocation( centro.x, margem );
    
     triangulo.paintMe( g );
    

    }

    public Triangulo getTriangulo() {
    return triangulo;
    }

}[/code]

Arquivo Frame.java

[code]import java.awt.;
import javax.swing.
;

/**
*

  • @author David Buzatto
    */
    public class Frame extends JFrame {

    public Frame() {

     PainelTriangulo painel = new PainelTriangulo();
     add( painel, BorderLayout.CENTER );
    
     setDefaultCloseOperation( EXIT_ON_CLOSE );
     setSize( 300, 300 );
     setVisible( true );
    

    }

    public static void main( String[] args ) {
    new Frame();
    }

}[/code]

Oi, davidbuzatto,

Convertendo o que já tenho para essa codificação, terei algum problema no momento de converter para Applet e depois chamar no .html?
Imagino que só o arquivo Frame.java que contem a classe Frame.java compilada a virar Frame.class é que será chamada na linha de applet do .html?
Sim ou não?

PS.: Cliquei em citar e assim imagino estar falando no fórum e não no mp (mensagem privada)…!
obrigada sempre!
sds

[quote=davidbuzatto]Segue o exemplo como vc pediu. Por favor, vamos discutir pelo fórum e não por mensagens privadas.

Triangulo.java

[code]import java.awt.*;

/**
*

  • @author David Buzatto
    */
    public class Triangulo {

    private Point vertice1;
    private Point vertice2;
    private Point vertice3;
    private Color corLado1;
    private Color corLado2;
    private Color corLado3;
    private Color corLabels;

    public Triangulo() {
    vertice1 = new Point();
    vertice2 = new Point();
    vertice3 = new Point();
    corLado1 = Color.RED;
    corLado2 = Color.GREEN;
    corLado3 = Color.BLUE;
    corLabels = Color.BLACK;
    }

    public void setCorLado1( Color corLado1 ) {
    this.corLado1 = corLado1;
    }

    public void setCorLado2( Color corLado2 ) {
    this.corLado2 = corLado2;
    }

    public void setCorLado3( Color corLado3 ) {
    this.corLado3 = corLado3;
    }

    public void setCorLabels( Color corLabels ) {
    this.corLabels = corLabels;
    }

    public Point getVertice1() {
    return vertice1;
    }

    public Point getVertice2() {
    return vertice2;
    }

    public Point getVertice3() {
    return vertice3;
    }

    public void paintMe( Graphics g ) {

     g.setColor( corLado1 );
     g.drawLine( vertice1.x, vertice1.y, vertice2.x, vertice2.y );
    
     g.setColor( corLado2 );
     g.drawLine( vertice2.x, vertice2.y, vertice3.x, vertice3.y );
    
     g.setColor( corLado3 );
     g.drawLine( vertice3.x, vertice3.y, vertice1.x, vertice1.y );
    
     g.setColor( corLabels );
     g.drawString( gerarLabel( vertice1 ), vertice1.x, vertice1.y + 15 );
     g.drawString( gerarLabel( vertice2 ), vertice2.x, vertice2.y + 15 );
     g.drawString( gerarLabel( vertice3 ), vertice3.x, vertice3.y - 10 );
    

    }

    private String gerarLabel( Point ponto ) {
    return ponto.x + ", " + ponto.y;
    }

}[/code]

PainelTriangulo.java

[code]import java.awt.;
import javax.swing.
;

/**
*

  • @author David Buzatto
    */
    public class PainelTriangulo extends JPanel {

    private Triangulo triangulo;

    public PainelTriangulo() {
    triangulo = new Triangulo();
    }

    @Override
    protected void paintComponent( Graphics g ) {

     super.paintComponent( g );
    
     g.setColor( Color.WHITE );
     g.fillRect( 0, 0, getWidth(), getHeight() );
    
     Point centro = new Point( getWidth() / 2, getHeight() / 2 );
     int margem = 30;
    
     /* 
      * Cria os vérticas com base na largura e altura do painel e a 
      * margem estipulada.
      * 
      * A mudança da posição dos vértices pode ser feita por fora do painel, 
      * acessando o triangulo pelo método getTriangulo.
      * Se assim desejar, as instruções de mudança dos vértices devem ser 
      * tiradas daqui.
      */
     triangulo.getVertice1().setLocation( margem, getHeight() - margem );
     triangulo.getVertice2().setLocation( getWidth() - margem, getHeight() - margem );
     triangulo.getVertice3().setLocation( centro.x, margem );
    
     triangulo.paintMe( g );
    

    }

    public Triangulo getTriangulo() {
    return triangulo;
    }

}[/code]

Arquivo Frame.java

[code]import java.awt.;
import javax.swing.
;

/**
*

  • @author David Buzatto
    */
    public class Frame extends JFrame {

    public Frame() {

     PainelTriangulo painel = new PainelTriangulo();
     add( painel, BorderLayout.CENTER );
    
     setDefaultCloseOperation( EXIT_ON_CLOSE );
     setSize( 300, 300 );
     setVisible( true );
    

    }

    public static void main( String[] args ) {
    new Frame();
    }

}[/code][/quote]

P: Convertendo o que já tenho para essa codificação, terei algum problema no momento de converter para Applet e depois chamar no .html?
R: Não, nenhum problema.

P: Imagino que só o arquivo Frame.java que contem a classe Frame.java compilada a virar Frame.class é que será chamada na linha de applet do .html?
Sim ou não?
R: Não. Vc vai ter que trocar o frame que fiz (que herda de JFrame) para um applet (que vai herdar de JApplet).

O fórum que falo é aqui onde estamos postando. Se vc manda mensagem privada para mim, ninguém mais lê e o propósito do fórum que é compartilhar conhecimento (sua dúvida pode ser dúvida de alguma outra pessoa) se perde entendeu? Para postar aqui basta clicar no responder. O botão citar vc usa quando quer citar o que alguém disse, para comentar alguma coisa entendeu?

[]´s

Vc vai ver no código que até tentei usar o update() para desenhar a linha, mas o pgm aborta e é só desabilitar os locais onde update está sendo chamado e referenciado para rodar…
Eu rodo no Eclipse, talvez tenha que inibir as três .gifs que tem…

sds

Holas, davidbuzzato,

Estava envolvida com o restante da lógica e que tenho que digitar material teórico para inicio de jan ainda, então só agora testei o Triangulo e ok!
Mas necessito urgente passar a classe MyTextArea extends JTextArea para (extends JPanel).
Vejo que cometi erro ao processar tudo numa classe só, agora falta liberdade para usar outras funcionalidades… mas tenho prazo e por isso voltar atrás fica quase impossível… Me ajuda?
Depois de desenhar no Panel o trianglinho então seria usar o paintComponent no listener do JButton bimput “Registrar Imputações”.

Posso enviar para vc tudo via mp…?

obrigada sempre!


Oiê,
E como seria ter um JButton “teste”, por ex.:, nessa lógica que ao ser pressionado desenharia uma drawLine(x1,y1,x2,y2) no meio ou qq parte do triangulo???

sds

[quote=davidbuzatto]Segue o exemplo como vc pediu. Por favor, vamos discutir pelo fórum e não por mensagens privadas.

Triangulo.java

[code]import java.awt.*;

/**
*

  • @author David Buzatto
    */
    public class Triangulo {

    private Point vertice1;
    private Point vertice2;
    private Point vertice3;
    private Color corLado1;
    private Color corLado2;
    private Color corLado3;
    private Color corLabels;

    public Triangulo() {
    vertice1 = new Point();
    vertice2 = new Point();
    vertice3 = new Point();
    corLado1 = Color.RED;
    corLado2 = Color.GREEN;
    corLado3 = Color.BLUE;
    corLabels = Color.BLACK;
    }

    public void setCorLado1( Color corLado1 ) {
    this.corLado1 = corLado1;
    }

    public void setCorLado2( Color corLado2 ) {
    this.corLado2 = corLado2;
    }

    public void setCorLado3( Color corLado3 ) {
    this.corLado3 = corLado3;
    }

    public void setCorLabels( Color corLabels ) {
    this.corLabels = corLabels;
    }

    public Point getVertice1() {
    return vertice1;
    }

    public Point getVertice2() {
    return vertice2;
    }

    public Point getVertice3() {
    return vertice3;
    }

    public void paintMe( Graphics g ) {

     g.setColor( corLado1 );
     g.drawLine( vertice1.x, vertice1.y, vertice2.x, vertice2.y );
    
     g.setColor( corLado2 );
     g.drawLine( vertice2.x, vertice2.y, vertice3.x, vertice3.y );
    
     g.setColor( corLado3 );
     g.drawLine( vertice3.x, vertice3.y, vertice1.x, vertice1.y );
    
     g.setColor( corLabels );
     g.drawString( gerarLabel( vertice1 ), vertice1.x, vertice1.y + 15 );
     g.drawString( gerarLabel( vertice2 ), vertice2.x, vertice2.y + 15 );
     g.drawString( gerarLabel( vertice3 ), vertice3.x, vertice3.y - 10 );
    

    }

    private String gerarLabel( Point ponto ) {
    return ponto.x + ", " + ponto.y;
    }

}[/code]

PainelTriangulo.java

[code]import java.awt.;
import javax.swing.
;

/**
*

  • @author David Buzatto
    */
    public class PainelTriangulo extends JPanel {

    private Triangulo triangulo;

    public PainelTriangulo() {
    triangulo = new Triangulo();
    }

    @Override
    protected void paintComponent( Graphics g ) {

     super.paintComponent( g );
    
     g.setColor( Color.WHITE );
     g.fillRect( 0, 0, getWidth(), getHeight() );
    
     Point centro = new Point( getWidth() / 2, getHeight() / 2 );
     int margem = 30;
    
     /* 
      * Cria os vérticas com base na largura e altura do painel e a 
      * margem estipulada.
      * 
      * A mudança da posição dos vértices pode ser feita por fora do painel, 
      * acessando o triangulo pelo método getTriangulo.
      * Se assim desejar, as instruções de mudança dos vértices devem ser 
      * tiradas daqui.
      */
     triangulo.getVertice1().setLocation( margem, getHeight() - margem );
     triangulo.getVertice2().setLocation( getWidth() - margem, getHeight() - margem );
     triangulo.getVertice3().setLocation( centro.x, margem );
    
     triangulo.paintMe( g );
    

    }

    public Triangulo getTriangulo() {
    return triangulo;
    }

}[/code]

Arquivo Frame.java

[code]import java.awt.;
import javax.swing.
;

/**
*

  • @author David Buzatto
    */
    public class Frame extends JFrame {

    public Frame() {

     PainelTriangulo painel = new PainelTriangulo();
     add( painel, BorderLayout.CENTER );
    
     setDefaultCloseOperation( EXIT_ON_CLOSE );
     setSize( 300, 300 );
     setVisible( true );
    

    }

    public static void main( String[] args ) {
    new Frame();
    }

}[/code][/quote]

Oiê, david,

E como ficam os gerenciadores de layout que contem os outros componentes qdo for criado o JPanel para o triangulo e manipulação dele.
Onde ele vai ficar no layout???

sds