Incluir Componente grafico en un JPanel

Iniciado por Fran88, 21 Agosto 2009, 19:45 PM

0 Miembros y 2 Visitantes están viendo este tema.

Fran88

Buenas!,

Estaba probando swing, y he creado en una clase, una pequeña "applet" que contiene nombre,texto y atributos, es un panel enanisimo y lo he pensado para dibujar un panelito de estos por cada Nodo de un arbol que voy a pintar.

El problema q tengo esq no he usado swing en mi vida y he estado mirando pero pierdo muxisimo tiempo y doy palos de ciego.

El codigo de mi clase NodoGrafico es este:


import java.awt.Dimension;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JEditorPane;

import javax.swing.WindowConstants;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.ListModel;

/**
* This code was edited or generated using CloudGarden's Jigloo
* SWT/Swing GUI Builder, which is free for non-commercial
* use. If Jigloo is being used commercially (ie, by a corporation,
* company or business for any purpose whatever) then you
* should purchase a license for each developer using Jigloo.
* Please visit www.cloudgarden.com for details.
* Use of Jigloo implies acceptance of these licensing terms.
* A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR
* THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED
* LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE.
*/
public class NodoGrafico extends javax.swing.JPanel {
private JEditorPane jEditorPane1;
private JEditorPane jEditorPane2;
private JButton jButton1;
private JScrollPane jScrollPane1;
private JList jList1;
private JButton jButton3;
private JButton jButton2;

/**
* Auto-generated main method to display this
* JPanel inside a new JFrame.
*/
/**public static void main(String[] args) {
JFrame frame = new JFrame();
frame.getContentPane().add(new NodoGrafico());
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}*/

public NodoGrafico() {
super();
initGUI();
}

public void initGUI() {
try {
setPreferredSize(new Dimension(100,150));
{
jButton1 = new JButton();
this.add(jButton1);
jButton1.setText("Nom:");
}
{
jEditorPane1 = new JEditorPane();
this.add(getJEditorPane1());
jEditorPane1.setText("nomb");
}
{
jButton2 = new JButton();
this.add(getJButton2());
jButton2.setText("Text:");
}
{
jEditorPane2 = new JEditorPane();
this.add(jEditorPane2);
jEditorPane2.setText("txt");
}
{
jButton3 = new JButton();
this.add(getJButton3());
jButton3.setText("Atribs:");
}
{
jScrollPane1 = new JScrollPane();
this.add(jScrollPane1);
jScrollPane1.setPreferredSize(new java.awt.Dimension(98, 36));
{
ListModel jList1Model =
new DefaultComboBoxModel(
new String[] { "Item One", "Item Two" });
jList1 = new JList();
jScrollPane1.setViewportView(jList1);
jList1.setModel(jList1Model);
jList1.setPreferredSize(new java.awt.Dimension(67, 36));
}
}

} catch (Exception e) {
e.printStackTrace();
}
}

public JEditorPane getJEditorPane1() {
return jEditorPane1;
}

public JButton getJButton1() {
return jButton1;
}

public JButton getJButton2() {
return jButton2;
}

public JButton getJButton3() {
return jButton3;
}

public JList getJList1() {
return jList1;
}

}

Tengo la clase principal q ya me dibuja un arbol, pero digamos q donde dibuja un rectangulo con "nombre" quiero sustituirlo por esa pequeña clase q os acabo de poner...

Yo estoy desesperado si alguien pudiera responderme lo agradeceria.


Fran88

Se me olvidaba el codigo del paintComponent q tengo en la clase principal:
/**
* Dibuja el árbol correspondiente
*/
protected void paintComponent(Graphics g){
super.paintComponent(g);
//la altura indica en cuanto debemos dividir la pantalla ( eje Y )
int altura=calcAltura(arbol, arbol.root());
//dibujamos cada nivel
for (int i=1; i<=altura; i++){
//obtenemos todos los nodos del nivel i y los guardamos en una lista
//Cogemos la lista de hijos
PositionList<Position<NodoXML>> lista=obtenerPosicionesNivel(i, arbol);
int nodosNivel=lista.size()+1;
int x=this.getWidth()/nodosNivel;
//la altura Y se obtiene multiplicando el espacio asignado a cada nivel (alto total de la pantalla dividido numero de niveles)
//por el nivel actual menos 1, para que la raiz nos quede bien arriba.
int y=(i-1)*this.getHeight()/altura;
int hijosagregados=0;
int hijospadre=0;

for (Position<NodoXML> p: lista){
//hay que dividir entre caso especial (nodo raiz) y caso normal
if (arbol.isRoot(p)){
y+=20;
//guardamos los valores de la ubicacion del nodo
p.element().setX(x);
p.element().setY(y);
//pintamos el nodo
// AQUI INCLUIRIAMOS EL COMPONENTE DEL NODO GRAFICO DE LA OTRA CLASE
g.drawRect(x, y, p.element().getNombre().length(), 20);
//pintamos los detalles del nodo
g.drawString("Nom:"+p.element().getNombre(), p.element().getX()+2, y+13);
}
//caso normal
else{
//calculamos estos valores auxiliares para el resto de las cuentas.
//hijospadre=arbol.parent(p).element().getChildren().size();
hijospadre=((NodePositionList<Position<NodoXML>>) arbol.children(arbol.parent(p))).size();
int mitad=hijospadre/2;
int difx=0;
//calculamos el diferencial de x, es decir, negativo si estamos insertando a izquierda
if (hijosagregados<mitad)
difx=-1;
//positivo si estamos agregando a derecha
else difx=1; 
//a la posicion del padre en x se le suma (o resta) un valor, resultado de:
//se multiplica el x del padre por 2, definiendo asi el espacio total para los hijos, que luego se divide
//entre los nodos del nivel, obteniendo asi la distancia entre nodos. Eso se multiplica por el valor absoluto
//de la resta mitad-hijosagregados, que señala que nodo estamos agregando y en que posicion debe ir:
//nos dira si es el nodo que esta justo a la mitad (0), si es el primero entre varios(mitad-0) o si es el ultimo entre varios.
//todo eso multiplicado por difx que indica hacia que lado se agrega(izquierda o derecha, - o +);
int saved=arbol.parent(p).element().getX()+(difx*arbol.parent(p).element().getX()*2/nodosNivel*(Math.abs(mitad-hijosagregados)));
//dibujamos los nodos
g.drawRect(saved, y, p.element().getNombre().length()+2, 15);
g.drawLine(saved+p.element().getNombre().length()/2, y, arbol.parent(p).element().getX()+arbol.parent(p).element().getNombre().length()/2, arbol.parent(p).element().getY()+15);
g.drawString("Nom:"+p.element().getNombre(), p.element().getX()+2, y+13);
//guardamos los valores de este nodo
p.element().setY(y);
p.element().setX(saved);
//verificamos si ya agregamos todos los hijos de un padre
//(notar que la lista de nodos los ordena de forma que todos los hijos de un mismo ancestro esten juntos)
if (hijosagregados<hijospadre)
hijosagregados++;
else hijosagregados=0;
}
}
}
}