Problema con cola (solucionado)

Iniciado por nolasco281, 25 Mayo 2014, 04:38 AM

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

nolasco281

Hola como estan

no se como implementar este codigo es un ejemplo de colas

El problema que tengo es que no se como llamar estas funciones en la parte principal
espero puedan ayudarme.


esto es lo que tengo en la principal
Código (java) [Seleccionar]
public static void main(String[] args) {
Principal p = new Principal();
               
p.setVisible(true);
p.setBounds(0, 0, 300, 200);
             
}




Clase cola

Código (java) [Seleccionar]
import java.util.ArrayList;


public class Cola {

private ArrayList nodos;

public Cola(){
nodos=new ArrayList<Integer>();
}

public void insertar(int x){
nodos.add(x);
}

public void eliminar(){
nodos.remove(0);
}

public void resetear(){
nodos.clear();
}


public ArrayList<Integer> getNodos() {
return nodos;
}


public void setNodos(ArrayList<Integer> nodos) {
this.nodos = nodos;
}
}




Clase que dibuja el panel

Código (java) [Seleccionar]
import java.awt.*;
import javax.swing.JPanel;


public class PanelDibujo extends JPanel {

public int x=20;
public int y=100;
public Cola cola;
public boolean swborrar=false;

public PanelDibujo(Cola c){
 cola=c;
}

public void paintComponent(Graphics g){
 super.paintComponents(g);
 Graphics2D g2d=(Graphics2D)g;
 g2d.setColor(Color.WHITE);
 g2d.fillRect(0,0,500,300);
 g2d.setColor(Color.BLACK);
 g2d.setStroke(new BasicStroke(2));
 for(int i=0;i<cola.getNodos().size();i++){
  if(i!=0){
   g2d.drawLine(2*x*(i+1)-10, y+15, 2*x*(i+1), y+15);
  }
  g2d.drawRoundRect(2*x*(i+1), y, 30, 30, 10, 10);
  g2d.drawString(""+cola.getNodos().get(i), 2*x*(i+1)+12, y+20);
 }
 
 if(swborrar){
  g2d.setColor(Color.WHITE);
  g2d.fillRect(0,0,400,200);
  cola.resetear();
  swborrar=false;
 }
}


public boolean isSwborrar() {
 return swborrar;
}


public void setSwborrar(boolean swborrar) {
 this.swborrar = swborrar;
}

}




Clase clase principal

Código (java) [Seleccionar]
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


import javax.swing.*;
import static javax.swing.JFrame.EXIT_ON_CLOSE;


public class Principal extends JApplet{

PanelDibujo pd;
JPanel pdatos;
Cola cola;
JTextField t;

public void init(){
 
 cola=new Cola();
 pd=new PanelDibujo(cola);
 pdatos=new JPanel();
 
 t=new JTextField(10);
 JButton b=new JButton("Agregar");
 b.addActionListener(new ActionListener(){


  @Override
  public void actionPerformed(ActionEvent e) {
   try{
    if(cola.getNodos().size()<8){
     cola.insertar(Integer.parseInt(t.getText()));
     pd.repaint();
     repaint();
    }else{
     JOptionPane.showMessageDialog(null, "Maximo se mostraran 8 elementos.");
    }
   }catch(NumberFormatException nfe){
    JOptionPane.showMessageDialog(null, "Error digite un Valor Valido");
   }
  }
 
 });
 
 JButton borrar=new JButton("Borrar");
 borrar.addActionListener(new ActionListener(){


  @Override
  public void actionPerformed(ActionEvent e) {
   if(cola.getNodos().size()>0){
    cola.eliminar();
    pd.repaint();
    repaint();
   }
  }
 });
 
 JButton limpiar=new JButton("Limpiar");
 limpiar.addActionListener(new ActionListener(){


  @Override
  public void actionPerformed(ActionEvent e) {
   pd.setSwborrar(true);
   pd.repaint();
   repaint();
  }
 
 });
 
 pdatos.add(new JLabel("Valor: "));
 pdatos.add(t);
 pdatos.add(b);
 pdatos.add(borrar);
 pdatos.add(limpiar);
 
 add(pd);
 add(pdatos,BorderLayout.SOUTH);
}
}
Lo que se puede imaginar... se puede programar.

EAMP14

#1
Antes que nada creo que es mejor que

p.setVisible(true);
p.setBounds(0, 0, 300, 200);


Esten dentro del constructor de Principal

Para implementar los métodos de otra clase, es necesario que hagas una instancia de la clase y crees un objeto de esa clase, en este caso Cola(); entonces tu main te podría quedar como:


   public static void main(String[] args) {
   Principal p = new Principal();
   Cola cola = new Cola();

   // Implementación
   cola.insertar(2);
   cola.resetear();
   // etc...
   
   }


Que de hecho tu clase Pirncipal ya lo está implementando. Pero esa seria la forma, accedes por medio del indentificador donde se aloja la referencia hacia el Objeto de esa Clase.

nolasco281

#2
Hola

Perdon ya entendi lo que tu mencionas, el problema es que no puedo hacer que salga la parte grafica pero entiendo lo que tratas de decirme, la parte grafiaca ya hace la insercion y el borrado si te fijas.

y a lo que haces mencion tu, solo llamo a los metodos de cola por lo tanto no va a pasar nada (de forma grafica pero si en memoria si no me equivoco)y lo que quiero es llamar al metodo de graficado ya que la insercion y el borrado lo hace dinamicamente desde la parte grafica.

A lo que tu mencionas de instaciar, no se como instanciar la clase que dibuja el panel o si eso es lo que hay que hacer estoy algo confundido con eso.

Gracias por contestar

saludos
Lo que se puede imaginar... se puede programar.

Migugami

JPanel llama automáticamente al método paintComponent(Graphics g) cuando se detecta algún posible cambio en la pantalla (movimiento de ventana, etc). Para hacer que un JPanel actualice su gráfica en un momento deseado basta con llamar al método repaint(). También puedes crear un método dibujar(JPanel panel, List<Nodo> nodos) que acepte la lista de nodos actual y un panel, y respecto a eso graficar algo en el panel recibido.

nolasco281

Hola. no entiendo muy bien.

La parte grafica ya la hace el programa lo que no se, es como llamarla o implementarla disculpen la ignorancia.

y gracias por responder.

Saludos.
Lo que se puede imaginar... se puede programar.

EAMP14

Bastaria con crear un Objeto de PanelDibujo y agregarlo a Principal en su constructor.

add(new PanelDibujo);

aunque no sé si extends JApplet funcione igual que un JFrame, no he trabajado con ello, pero igual,
mejor dejo en manos de mi otro compañero  que tiene mas conocimientos con esto. Es muy bueno! Saludos.

nolasco281

#6
Cita de: EAMP14 en 25 Mayo 2014, 09:09 AM
Bastaria con crear un Objeto de PanelDibujo y agregarlo a Principal en su constructor.

add(new PanelDibujo);

aunque no sé si extends JApplet funcione igual que un JFrame

A eso iba tratando de hacer una instancia de PanelDubijo

pero estoy seguro asi seguro de que no va asi. ya aunque fuera asi no serviria ya que le estoy mandando un dato a una metodo. y lo que deseo en pocas palabras es llamar al toda la clase que me dibuje la parte grafica del todo el programa.

Código (java) [Seleccionar]
PanelDibujo o = new PanelDibujo(Dato que se le manda del textbox);

estaba viendo ejemplos en donde llama a toda la clase de la siquiente manera
pero tampoco funciono.

Código (java) [Seleccionar]
new Principal();

Mil gracias por tomarte el tiempo de contestar.

Saludos.
Lo que se puede imaginar... se puede programar.

nolasco281

Ya solucione el problema mil gracias a los que contestaron.

saludos.
Lo que se puede imaginar... se puede programar.