Foro de elhacker.net

Programación => Java => Mensaje iniciado por: Mai89 en 9 Agosto 2011, 19:06 pm



Título: Problema con JButton y ordenación
Publicado por: Mai89 en 9 Agosto 2011, 19:06 pm
Os explico la otra tarde se me ocurrió crear un programilla para que me resolviera una serie de cuadros. El caso es que el método de cálculo lo hice en un momento, pero crear la ventana... puff.
El caso es que no tengo ni idea de cómo hacer ventanas y de cómo colocar los elementos, he estado viendo códigos por diversas webs y al final he conseguido eso que veis a continuación.
(http://img836.imageshack.us/img836/1685/capturaqd.jpg)
La idea es meter las tres variables y que me generara el cuadro cuando presionara el botón... pero no tengo ni idea de cómo hacerlo.
El caso es que creé dos paneles, el primer panel lo dividí en una matriz para ordenar los labels, cuadros de texto y el botón. En el segundo panel pondría la tabla que me resultaría de los cálculos y tal...
El caso es que al poner la matriz el cuadro que yo tenia con variables fijas para ver si me aparecía o no se esfumó y no hay narices a sacarlo...
Necesito una ayudita en general... así que.. yo dejo el código de la clase para que le echéis un vistazo y me matéis por mala programadora si es preciso xDD

Código
  1. //Atributo para crear la ventana
  2.    private static JFrame ventanap;
  3.  
  4.    //Atributo para crear los paneles
  5.    private static JPanel panel_norte;
  6.    private static JPanel panel_central;
  7.  
  8.    //Atributos para la tabla(CENTRO)
  9.    final String[] nombre_columna= {"n",
  10.                                    "a",
  11.                                    "I",
  12.                                    "A",
  13.                                    "M",
  14.                                    "C"};
  15.    private static JTable tabla;
  16.    CalculoPrestamo calculo;
  17.  
  18.    //Atributos para crear los labels(NORTE)
  19.    private  JLabel lab_Co;
  20.    private JLabel lab_ano;
  21.    private JLabel lab_interes;
  22.  
  23.    //Atributos para los cuadros de texto(NORTE)
  24.    private static JTextField tf_Co;
  25.    private static JTextField tf_ano;
  26.    private static JTextField tf_interes;
  27.  
  28.    //Atributo botón y lo correspondiente a él.
  29.    private static JButton boton;
  30.    VentanaFrances crea_tabla;
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.    //CONSTRUCTOR
  38.    public VentanaPrestamo() {
  39.  
  40.        // Crea la ventana pone nombre, ajusta el tamaño al contenido y la hace visible
  41.        ventanap=new JFrame("Cuadro de Prestamo");
  42.        ventanap.setSize(500,200);
  43.        ventanap.setVisible(true);
  44.        //cierra la ventana correctamente deteniendo el proceso y todo lo demás
  45.        ventanap.setDefaultCloseOperation(ventanap.EXIT_ON_CLOSE);
  46.        calculo=new CalculoPrestamo(15000, 5, 3);
  47.  
  48.  
  49.  
  50.  
  51.        // Activa la colocacion para que podamos meter los paneles
  52.        ventanap.setLayout(new BorderLayout());
  53.  
  54.  
  55.        //Objetos correspondientes al panel NORTE
  56.        panel_norte=new JPanel();
  57.       //Coloco en el panel norte la etiqueta del capital inicial
  58.        ventanap.setLayout(new GridLayout(4,3));
  59.        lab_Co=new JLabel("Capital Inicial");
  60.        lab_Co.setToolTipText("Capital Inical:");
  61.        ventanap.add(lab_Co, BorderLayout.NORTH);
  62.  
  63.        tf_Co=new JTextField();
  64.        tf_Co.setSize(20,10);
  65.        ventanap.add(tf_Co, BorderLayout.NORTH);
  66.  
  67.        lab_interes=new JLabel("Tipo de Interes");
  68.        lab_interes.setToolTipText("Tipo de Interes:");
  69.        ventanap.add(lab_interes, BorderLayout.NORTH);
  70.  
  71.        tf_interes=new JTextField();
  72.        tf_interes.setSize(20,10);
  73.        ventanap.add(tf_interes, BorderLayout.NORTH);
  74.  
  75.        lab_ano=new JLabel("Año");
  76.        lab_ano.setToolTipText("Nº de Años:");
  77.        ventanap.add(lab_ano, BorderLayout.NORTH);
  78.  
  79.        tf_ano=new JTextField();
  80.        tf_ano.setSize(20,10);
  81.        ventanap.add(tf_ano, BorderLayout.NORTH);
  82.  
  83.  
  84.        //Correspondiente al boton y lo que hace
  85.        boton=new JButton("Generar cuadro");
  86.        ventanap.add(boton, BorderLayout.NORTH);
  87.  
  88.        ventanap.add(null, BorderLayout.NORTH);
  89.  
  90.  
  91.  
  92.  
  93.        //Creo la tabla, indico el tamaño y añado un scrollpane
  94.        tabla=new JTable(calculo.resultado_tabla(), nombre_columna);
  95.        tabla.setPreferredScrollableViewportSize(null);
  96.  
  97.        tabla.setForeground(Color.blue);
  98.        tabla.setBackground(Color.LIGHT_GRAY);
  99.  
  100.        //Objetos correspondientes al panel CENTRAL
  101.        panel_central=new JPanel();
  102.        ventanap.setLayout(new BorderLayout());
  103.        ventanap.setLayout(new GridLayout());
  104.        ventanap.add(panel_central, BorderLayout.CENTER);
  105.        panel_central.add(tabla);
  106.  
  107.  



Título: Re: Problema con JButton y ordenación
Publicado por: Valkyr en 9 Agosto 2011, 20:23 pm
Perdóname porque tan solo he leído el principio del código y he pensado en responderte algo que espero que te ayude.

Si quieres crear una ventana yo haría lo siguiente:

Heredaría de la clase JFrame, y pondría como atributos las tres labels y los tres fields, además del JButton. Es decir, sería algo así:

Código
  1. public class MiVentana extends JFrame {
  2.  
  3.        private JLabel label1;
  4. private JLabel label2;
  5. private JLabel label3;
  6. private JTextField campo1;
  7. private JTextField campo2;
  8. private JTextField campo3;
  9. private JButton botonCalculos;
  10.  
  11. public MiVentana(String tituloVentana){
  12.                super();
  13.                setTitle(tituloVentana);
  14.                getContentPane().setLayout(null);
  15. setResizable(false); //False indica que el usuario no puede cambiar el tamaño de la ventana, true indica que si puede cambiarlo
  16. label1 = new JLabel("Capital Inicial");
  17. label2 = new JLabel("Tipo de interés");
  18. label3 = new JLabel("Año");
  19.  
  20. campo1 = new JTextField(30);
  21. campo2 = new JTextField(30);
  22. campo3 = new JTextField(40);
  23.  
  24. botonCalculos = new JButton("Generar cuadro");
  25.  
  26. botonCalculos.addActionListener(new ActionListener(){
  27. public void actionPerformed(ActionEvent arg0) {
  28. //Mostrar Informacion en otro JFrame o en un JDialog
  29. }
  30.  
  31. });
  32.                //Este metodo es para especificar que hacer al pulsar la X de la ventana
  33.                addWindowListener(new WindowAdapter() {
  34. public void windowClosing(WindowEvent e) {
  35. dispose();
  36. System.exit(0);
  37. }
  38. });
  39. //Los valores de X, Y, WIDTH, HEIGHT los especificas para colocar los elementos en la posicion que desees de tu ventana
  40. getContentPane().add(label1);
  41. label1.setBounds(x, y, width, height);
  42. getContentPane().add(label2);
  43. label2.setBounds(x, y, width, height);
  44. getContentPane().add(label3);
  45. label3.setBounds(x, y, width, height);
  46. getContentPane().add(campo1);
  47. campo1.setBounds(x, y, width, height);
  48. getContentPane().add(campo2);
  49. campo2.setBounds(x, y, width, height);
  50. getContentPane().add(campo3);
  51. campo3.setBounds(x, y, width, height);
  52. getContentPane().add(botonCalculos);
  53. botonCalculos.setBounds(x, y, width, height);
  54.  
  55.                //Desde aqui hasta el final es para que la ventana aparezca centrada en la pantalla y para mostrarla
  56. pack();
  57. java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
  58.                //El metodo siguiente cambia el tamaño de la ventana
  59. setSize(new java.awt.Dimension(540, 280));
  60. setLocation((screenSize.width - 540) / 2, (screenSize.height - 280) / 2);
  61. setVisible(true);
  62. }
  63. }

En este código estamos creando una ventana personalizada.

En la acción que debes realizar al pulsar el botón (he puesto un comentario indicando donde es) podrías o crear un JFrame nuevo, añadir los elementos que quieras mostrar o crear un JDialog y mostrar la información.

Me imagino que habrá muchas mas formas de realizar lo que tú quieres y que la forma que te propongo no será la mejor. Pero yo es una de las formas que he usado y me ha ido bastante bien.

Cualquier duda pregunta ;)

Saludos.


Título: Re: Problema con JButton y ordenación
Publicado por: L0n3l1eR en 10 Agosto 2011, 07:41 am
Buenas noches hmmm no se por algunos hacen sus frames ala antigua .. pudiendole hacer con el palette pero en fin... Mira te recomiendo esta pagina donde te enseña a usar la mayoria de los componentes de la GUI.. Tablas, jtress etc..

http://chuwiki.chuidiang.org/index.php?title=Categor%C3%ADa:Java:SWING (http://chuwiki.chuidiang.org/index.php?title=Categor%C3%ADa:Java:SWING)

Si te pones abusado puedes usar drag y drop del palette y la otra mitad ala antigua

Saludos!


Título: Re: Problema con JButton y ordenación
Publicado por: Mai89 en 11 Agosto 2011, 13:23 pm
Valkyr, estoy consiguiendo más decente con lo que me has pasado, pero esta parte del código no me compila y no tengo ni idea de porque es xDD
Código
  1. //Este metodo es para especificar que hacer al pulsar la X de la ventana
  2.                addWindowListener(new WindowAdapter() {
  3. public void windowClosing(WindowEvent e) {
  4. dispose();
  5. System.exit(0);
  6. }
  7. });
L0n3l1eR, no es que haga las cosas al modo antiguo o al moderno, es que nunca me había puesto a hacer ventanas, en mi FP no me enseñaron a hacerlas =( y tampoco me explicaron nada, así que en este tema estoy muuy verde. En cualquier caso le estado echando un vistazo al enlace, y ya me lo he agregado a favoritos.

PD: Valkyr, acabo de darme cuenta de que somos paisanos!! xDD


Título: Re: Problema con JButton y ordenación
Publicado por: Valkyr en 11 Agosto 2011, 15:54 pm
Valkyr, estoy consiguiendo más decente con lo que me has pasado, pero esta parte del código no me compila y no tengo ni idea de porque es xDD
Código
  1. //Este metodo es para especificar que hacer al pulsar la X de la ventana
  2.                addWindowListener(new WindowAdapter() {
  3. public void windowClosing(WindowEvent e) {
  4. dispose();
  5. System.exit(0);
  6. }
  7. });

Acabo de mirar el proyecto que tengo y lo tengo exactamente igual, así que lo único que se me ocurre es que no has importado estos dos paquetes:

Código
  1. import java.awt.event.WindowAdapter;
  2. import java.awt.event.WindowEvent;

Compruébalo, y si no es ese el problema pues me dices!! ;)

Citar
PD: Valkyr, acabo de darme cuenta de que somos paisanos!! xDD

Jajaja cierto, no estamos muy lejos!! Poca gente he encontrado por aquí que sea de la región xD.

Por cierto, yo acabo de terminar 2º año de la carrera y a penas hemos visto cosas de interfaz gráfica de ventanas, pero por Internet está todo muy bien explicado y con Java la mayoría de cosas son bastante sencillicas.

Saludos y ya nos comentas!


Título: Re: Problema con JButton y ordenación
Publicado por: Mai89 en 11 Agosto 2011, 19:11 pm
Pues tengo toda la clase import java.awt.event. importada así que no sé voy a seguir dándole vueltas al tema, y a colocarme bien lo demás.

Yo me hice el FP de Administración de Sistmas, y un año de Grado pero el grado se me fue a tomar viento y tuve que volver, más que nada porque no tenia pasta ni para pillar una habitación en un piso. Me resulta raro que deis Java en programación, normalmente se da C/C++, o por lo menos yo... Pero vamos este año tengo la intención de retomarla por la UNED


Título: Re: Problema con JButton y ordenación
Publicado por: Valkyr en 11 Agosto 2011, 19:39 pm
¿Cuál es el fallo que te da exactamente? Yo lo he compilado y ejecutado con Eclipse y no me ha dado ningún fallo.

Sí, el año pasado tuvimos Pascal y C++, este año hemos tenido C++, Java y C. No damos clases sobre el lenguaje en sí, si no de programación (salvo Java que si lo hemos visto a fondo en la asignatura de POO) y luego en las clases de prácticas es donde ya vemos las caracteristicas fundamentales del lenguaje. Pero vamos, siempre he pensado que la documentación de un lenguaje siempre va a estar ahí, la cuestión es saber usarlo xD.

La verdad que es mucho dinero el de un piso, yo este año he estado viviendo en uno y...se han ido muchas muchas perras jajaja.


Título: Re: Problema con JButton y ordenación
Publicado por: Mai89 en 22 Agosto 2011, 13:33 pm
Perdón, he estado un poco ausente unos días. Pues no sé el fallo exactamente, ya te lo pondré con detalle, de momento voy a terminar de hacer la ventana y tal que ya le he pillado el truco a la colocación, cuando lo tenga todo colocado ya me preocuparé de la acción del botón en profundidad.

Pues mucha suerte con la carrera! yo al final paso de la uned, me voy a meter al DAM xD a distancia también, a ver que tal me va.


Título: Re: Problema con JButton y ordenación
Publicado por: Debci en 22 Agosto 2011, 17:24 pm
Excelentes respuestas valkyr.

Doy el tema por zanjado?

Saludos


Título: Re: Problema con JButton y ordenación
Publicado por: Valkyr en 22 Agosto 2011, 17:53 pm
Excelentes respuestas valkyr.

Doy el tema por zanjado?

Saludos


Se agradece :), y yo diría que sí, pero yo no soy el que ha creado el tema.

Saludos.


Título: Re: Problema con JButton y ordenación
Publicado por: Mai89 en 22 Agosto 2011, 18:26 pm
Dalo por zanjado, si me surge cualquier cosa te lo mandaré en un privado. Thanks a todos!


Título: Re: Problema con JButton y ordenación
Publicado por: [u]nsigned en 24 Agosto 2011, 17:56 pm
//Programa.java
Valkyr, estoy consiguiendo más decente con lo que me has pasado, pero esta parte del código no me compila y no tengo ni idea de porque es xDD
Código
  1. //Este metodo es para especificar que hacer al pulsar la X de la ventana
  2.                addWindowListener(new WindowAdapter() {
  3. public void windowClosing(WindowEvent e) {
  4. dispose();
  5. System.exit(0);
  6. }
  7. });
L0n3l1eR, no es que haga las cosas al modo antiguo o al moderno, es que nunca me había puesto a hacer ventanas, en mi FP no me enseñaron a hacerlas =( y tampoco me explicaron nada, así que en este tema estoy muuy verde. En cualquier caso le estado echando un vistazo al enlace, y ya me lo he agregado a favoritos.

PD: Valkyr, acabo de darme cuenta de que somos paisanos!! xDD


Hola, soy totalmente nuevo en Java, empece a estudiarlo por mi cuenta hace dos dias  :xD. En eclipse compila porque el IDE agrega internamente las librerias necesarias, pero compilando a mano no, por ejemplo dejo este codigo que estoy escribiendo para praticar:

Código
  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import javax.swing.*;
  4.  
  5. class MyFrame extends JFrame {
  6. private JTextField input;
  7. private JButton boton;
  8. private JButton salir;
  9.  
  10. MyFrame(){
  11. setLayout(null);
  12. setSize(410, 220);
  13. setResizable(false);
  14. setBackground(Color.red);
  15.  
  16. input = new JTextField();
  17. input.setBounds(10,10,280,35);
  18. add(input);
  19.  
  20. boton = new JButton("Ejecutar");
  21. boton.setBounds(300,10,100,35);
  22. boton.addActionListener(new ActionListener(){
  23. public void actionPerformed(ActionEvent e){
  24. String t = input.getText();
  25. System.out.println(t);
  26. }
  27. });
  28. add(boton);
  29.  
  30. salir = new JButton("Salir");
  31. salir.setBounds(300,150,100,35);
  32. salir.addActionListener(new ActionListener(){
  33. public void actionPerformed(ActionEvent e){
  34. System.exit(0);
  35. }
  36. });
  37. add(salir);
  38.  
  39. addWindowListener(new WindowAdapter(){
  40. public void windowClosing(WindowEvent e){
  41. System.exit(0);
  42. }
  43. });
  44.  
  45. show();
  46. }
  47. }
  48.  
  49. public class Programa {
  50. public static void main(String[] args){
  51. MyFrame f = new MyFrame();
  52. }
  53. }
  54.  

Asi como esta si compila 'a mano' ejecutando desde la consola
Código:
javac Programa.java

Pero si quito la segunda linea, la que esta resaltada, me arroja este error:

Citar
C:\java\Programa>javac Programa.java
Programa.java:23: error: cannot find symbol
                boton.addActionListener(new ActionListener(){
                                            ^
  symbol:   class ActionListener
  location: class MyFrame
Programa.java:33: error: cannot find symbol
                salir.addActionListener(new ActionListener(){
                                            ^
  symbol:   class ActionListener
  location: class MyFrame
Programa.java:40: error: cannot find symbol
                addWindowListener(new WindowAdapter(){
                                      ^
  symbol:   class WindowAdapter
  location: class MyFrame
Note: Programa.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
3 errors

Como dije, soy totalmente nuevo en Java, pero con esto veo que importar todo un paackage no es 100% seguro  :xD

Saludos


Título: Re: Problema con JButton y ordenación
Publicado por: RyogiShiki en 24 Agosto 2011, 23:17 pm
Hola, bueno acabo de probar el código desde mi compilador en Linux, más exactamente openSUSE 11.4 y todo ha ido correctamente excepción de algunos warns que tomaré más adelante, es por esto que te sugiero que verifices si todo está correctamente bien instalado el JDK y el JRE, si ambos están es sus versiones más recientes,  para evitar cualquier complicación, además de verificar si los path están correctamente.

Por otro lado el siguiente método es obsoleto, lo que hará que javac arroje una advertencia:

Código
  1. show();

Y en su lugar debería usarse:

Código
  1. setVisible(true);

Ahora en la clase que contiene a main, también se arrojará una advertencia debido a que simplemente se crea un objeto pero nada se hace con este, por lo que sugiero que sea cambiado de la siguiente forma:

Código
  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import javax.swing.*;
  4.  
  5. class MyFrame extends JFrame {
  6. private JTextField input;
  7. private JButton boton;
  8. private JButton salir;
  9.  
  10. MyFrame(){
  11. setLayout(null);
  12. setSize(410, 220);
  13. setResizable(false);
  14. setBackground(Color.red);
  15.  
  16. input = new JTextField();
  17. input.setBounds(10,10,280,35);
  18. add(input);
  19.  
  20. boton = new JButton("Ejecutar");
  21. boton.setBounds(300,10,100,35);
  22. boton.addActionListener(new ActionListener(){
  23. public void actionPerformed(ActionEvent e){
  24. String t = input.getText();
  25. System.out.println(t);
  26. }
  27. });
  28. add(boton);
  29.  
  30. salir = new JButton("Salir");
  31. salir.setBounds(300,150,100,35);
  32. salir.addActionListener(new ActionListener(){
  33. public void actionPerformed(ActionEvent e){
  34. System.exit(0);
  35. }
  36. });
  37. add(salir);
  38.  
  39. addWindowListener(new WindowAdapter(){
  40. public void windowClosing(WindowEvent e){
  41. System.exit(0);
  42. }
  43. });
  44. }
  45. }
  46.  
  47. public class Programa {
  48. public static void main(String[] args){
  49. MyFrame f = new MyFrame();
  50.                f.setDefaultCloseOperation(EXIT_ON_CLOSE);
  51.                f.setVisible(true);
  52. }
  53. }

Claro eso en está ocasión si es solo para eso para lo que vas a usar el frame, ya seguramente en futuras ocasiones y distintos problemas lo uses como más te convenga.

Pero como se suele decir un warning es un error permitido por el compilador, claro que es muy  posible que en java te encuentres con que no siempre es así. Aunque en mi opinión entre menos warnings mejor. Para ver todas las warnings que pueda arrojar tu programa con el flag -Xlint como se haria en C/C++ con -Wall o -Wextra.

Código
  1. javac -Xlint Programa.java

Al menos eso es lo que veo, y a mi me compila perfecto, pero imagino que alguien más puede tener una observación más precisa a lo que planteo.

Saludos


Título: Re: Problema con JButton y ordenación
Publicado por: Mai89 en 25 Agosto 2011, 12:18 pm
En mi caso no sé si sera porque estoy usando NetBeans... pero vamos... Tengo todas las librerías importadas y demás... El caso es que estoy al borde de los exámenes de septiembre y no he conseguido sacar otro rato para ponerme a programar. T.T