Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Fran88

#1
Java / Re: Dibujar un árbol en Java sin usar JTree
13 Septiembre 2009, 17:39 PM
Estamos a domingo y estoy ansioso por ver tu metodo!!  ;D xD
#2
Java / Re: Dibujar un árbol en Java sin usar JTree
8 Septiembre 2009, 18:37 PM
Parece ser q el algoritmo inicial falla..no funciona para todos los casos, en cuanto metes 3 niveles el ultimo con muxos hijos se empiezan a solapar...e incluso hay veces q un nodo se sale del panel y no se ve en pantalla.

Alguna idea??

gracias
#3
Nada, no hay manera...
#4
yo utilizo un metodo de la tabla hash q me devuelve una lista de tipo Iterable, pero no sera dificil pasarla a ArrayList...
Voy a echar un vistazo a lo q me has pasado, gracias!
#5
Buenas, estoy creando una JComboBox pero quiero hacerlo de forma q se construya a partir de una lista, el problema es q si añado con addItem una vez, 2 o 3, funciona, pero al hacerlo con un iterador en un bucle q lea la lista, dice q lo inserta pero al visualizarlo aparece un elemento en la caja y no se despliega nada!!!
Mi codigo donde la creo es este:

public void creaCB(HashTableMap<String, String> Atribs,NodoArbol nodog){
Iterable<Entry<String, String>> listaCombo=Atribs.entries();
Iterator<Entry<String, String>>it= listaCombo.iterator();
System.out.println("LISTA HASH: ");
System.out.println(listaCombo);
if(!it.hasNext()){ System.out.println("LA TABLA NO TIENE ELEMENTOS");
nodog.remove(jLabel3);
CampoNom.setPreferredSize(new java.awt.Dimension(106, 20));
}
else{
CampoAtrib = new JComboBox();
int i=0;
while(it.hasNext()){
if(i==0)CampoAtrib.addItem(it.next().toString());
else CampoAtrib.insertItemAt(it.next().toString(), i);
i++;
}
System.out.println("Hemos insertado en la tabla: "+CampoAtrib.getItemCount()+" elementos");
System.out.println(" El elem 1 es: ");
System.out.println(CampoAtrib.getItemAt(1));
CampoAtrib.setPreferredSize(new java.awt.Dimension(97, 20));

CampoAtrib.addActionListener(new ActionListener() {
@SuppressWarnings("unchecked")
@Override
public void actionPerformed(ActionEvent e) {
JComboBox cb = (JComboBox)e.getSource();
    String newSelection = (String)cb.getSelectedItem();
//AQUI ES DONDE ESCRIBES EL VALOR Q TIENE EL ID
// Accion a realizar cuando el JComboBox cambia de item seleccionado.
//Entry<String, String> val=(Entry<String, String>) CampoAtrib.getSelectedItem();
// CampoValAtrib.setText(val.getValue().toString());
CampoValAtrib.setText(newSelection);
}
});
this.add(CampoAtrib);


gracias
#6
He actualizado esa linea por esta otra:
//nodosNivel al ejecutar esta linea tiene el valor de los nodos del ultimo nivel...
panel.setPreferredSize(new Dimension((maxNodos+nodosNivel)*130,(altura+1)*170));

Parece ser q asi funciona, al menos con las 3 pruebas q he hecho, tengo q hacer mas, metiendo mas niveles al arbol pero lo pongo por si alguien me corrige.
#7
Tengo un problema ahora, he seguido la estructura del codigo de juancho77, pero en su lugar estoy pintando sobre un JPanel, el problema es que el usaba el metodo de JFrame "Pack()" para ajustar automaticamente la pantalla ala necesidad del arbol, es decir, si el arbol era mas grande se redimensionaba sola la pantalla gracias a este metodo.

Mi problema es que JPanel q yo sepa no puede usar el metodo Pack() y no conozco de la existencia de uno similar q ajuste al panel.
Sobre todo porque para dibujar en el panel he tenido q poner SetLayout(null) y el metodo "getPreferedSize" no me sirve teoricamente...
Si no pongo ese metodo SetLayout a null teoricamente podria redimensionarse, pero si no me equivoco perderia las coordenadas x e y donde pinto cada nodo...

Hasta ahora lo q he hecho ha sido añadir al final del paintComponent esta linea:
//Altura es la profundidad del arbol, el numero de niveles q tiene...
panel.setPreferredSize(new Dimension(maxNodos*130,altura*170));

el problema es que la coordenada X se inicializa al principio de cada iteracion asi:
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.
y=(i-1)*(this.getHeight()/altura);


Al hacer esto ya hay casos en los que no me pinta bien el arbol porque el calculo de la coordenada x depende del tamaño del panel, y como podeis ver en mi codigo, el tamaño del panel depende de maxNodos(nivel del arbol con mas nodos).

Creo que me muerooo, ayudaa!!!! xDDD
#8
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;
}
}
}
}
#9
Java / Incluir Componente grafico en un JPanel
21 Agosto 2009, 19:45 PM
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.

#10
Java / Re: Acceder a metodo Protected
14 Agosto 2009, 09:40 AM
Gracias, la verdad esque tengo un lio con eso, pq queria añadir un nodo a mi arbol y pensaba q la unica manera de hacerlo era con el metodo createNode, pero parece ser q con getChildren se puede hacer...seguire investigando por mi cuenta.