Necesito añadir en un panel con NULL LAYOUT una serie de lineas animadas (con el efecto de que crezcan con el tiempo hasta un punto dado), y que pueda colocar exactamente en una posicion determinada de ese Jpanel. Para explicarme mejor os posteo un trozo de codigo en donde se vea mas o menos lo que quiero hacer. En este ejemplo ya se ve que no estoy haciendo algo bien, porque no puedo añadir la linea en un JPanel dentro del JFrame principal (ya que sino no se ve la linea). Asi que el ejemplo lo pongo pintando la linea sobre el Frame directamente. Y el problema mas importante del ejemplo es que tengo que ponerle al JFrame un BorderLayout, en lugar del necesario nullLayout, ya que si no, la linea se pinta y luego desaparece. Ahí va el ejemplo:
Código:
Así, me gustaria poder hacer que la línea se quede donde se pintó al principio (en la posicion donde le indico), y además, que la línea se pinte en un Jpanel con NULL Layout que se haya añadido al Frame principal a modo de lienzo (y no en un CANVAS: en un JPanel...) //CLASE PRINCIPAL Prueba.java import java.awt.*; import javax.swing.*; public class Prueba extends javax.swing.JFrame { private Linea l; private javax.swing.JButton jButton1; public Prueba() { jButton1 = new javax.swing.JButton(); jButton1.setText("jButton1"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } }); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { exitForm(evt); } }); getContentPane().add(jButton1, java.awt.BorderLayout.NORTH); pack(); this.setBounds(100,100,550,450); Point inicio = new Point(100,200); Point fin = new Point (100,100); Graphics gp = this.getGraphics(); Linea linea = new Linea(gp,inicio,fin); l=linea; this.getContentPane().add(linea); } private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { this.l.simular(); this.repaint(); } private void exitForm(java.awt.event.WindowEvent evt) { System.exit(0); } public static void main(String args[]) { new Prueba().show(); } } //--------------------------------------------------------- //CLASE Linea.java import java.awt.*; import javax.swing.*; import java.util.*; import java.awt.*; import javax.swing.*; import java.awt.geom.Line2D; import java.awt.BasicStroke; import java.awt.geom.GeneralPath; public class Linea extends Component{ private int contadorInicial; private int contadorFinal; private Point puntoInicial; private Point puntoFinal; private int valorY; private Graphics g; public Linea(Graphics gr,Point ini, Point fin) { this.g = gr; this.puntoInicial = ini; this.puntoFinal = fin; this.valorY=puntoInicial.y; } public void update( Graphics g ) { paint(g); } public void paint( Graphics g ) { Graphics2D g2d = (Graphics2D)g; BasicStroke estiloLinea = new BasicStroke(4); g2d.setStroke(estiloLinea); g2d.setColor(Color.red); if (!(valorY==puntoInicial.y)) { Point f = new Point (puntoFinal.x,valorY); Line2D.Float linea = new Line2D.Float(puntoInicial,f); g2d.draw(linea); } } public boolean simular () { while(this.valorY>this.puntoFinal.y) { this.valorY--; this.update(g); try { Thread.currentThread().sleep( 50 ); } catch( InterruptedException e ) { System.out.println( e ); } } return(true); } }
Hay alguien que pueda orientarme con algún consejo, ejemplo o cualquier cosa??? Muchisimas gracias a todos.