2012-06-30 52 views
6

He estado sentado aquí en mi computadora durante aproximadamente 13 horas y creo que mis ojos están sangrando. Encontré un pequeño editor de gui que me encanta llamado GuiGenie. Funciona perfecto para crear la ventana con los botones y todas esas cosas buenas. El problema es que quiero hacer clic en un botón en mi primer menú y hacer que abra mi otro menú que hice. Acabo de comenzar a programar hace 4 semanas, así que soy un completo novato. tengo la sensación de su echar a perder debido a los métodos principales, pero no tengo ni idea y 13 horas de estar sentado aquí tratando millones de cosas me está haciendo vuelvo loco:) Esto es lo que tengo hasta ahoraJava Abrir una nueva ventana haciendo clic en un botón

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.event.*; 

public class MyPanel extends JPanel { 
private JTextField How; 
private JLabel jcomp2; 
private JLabel jcomp3; 
private JButton jcomp4; 

public MyPanel() { 
    //construct components 
    How = new JTextField (1); 
    jcomp2 = new JLabel ("How long were you parked?"); 
    jcomp3 = new JLabel ("Minutes"); 
    jcomp4 = new JButton ("openNewWindow"); 

    //adjust size and set layout 
    setPreferredSize (new Dimension (315, 85)); 
    setLayout (null); 

    //add components 
    add (How); 
    add (jcomp2); 
    add (jcomp3); 
    add (jcomp4); 

    //set component bounds (only needed by Absolute Positioning) 
    How.setBounds (245, 50, 60, 25); 
    jcomp2.setBounds (35, 30, 185, 50); 
    jcomp3.setBounds (250, 30, 60, 20); 
    jcomp4.setBounds (0, 0, 315, 25); 

     jcomp4.addActionListener(new ActionListener() 
    { 
     public void actionPerformed(ActionEvent e) 
     { 

     } 
    }); 
} 


public static void main (String[] args) { 
    JFrame frame = new JFrame ("MyPanel"); 
    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().add (new MyPanel()); 
    frame.pack(); 
    frame.setVisible (true); 
} 
} 

Cuando se presiona el botón, quiero que abra esta nueva ventana

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.event.*; 

public class MyPanel2 extends JPanel { 
private JButton jcomp1; 
private JButton jcomp2; 
private JButton jcomp3; 
private JTextField jcomp4; 

public MyPanel2() { 
    //construct components 
    jcomp1 = new JButton ("test1"); 
    jcomp2 = new JButton ("test2"); 
    jcomp3 = new JButton ("test3"); 
    jcomp4 = new JTextField (5); 

    //adjust size and set layout 
    setPreferredSize (new Dimension (395, 156)); 
    setLayout (null); 

    //add components 
    add (jcomp1); 
    add (jcomp2); 
    add (jcomp3); 
    add (jcomp4); 

    //set component bounds (only needed by Absolute Positioning) 
    jcomp1.setBounds (20, 45, 100, 25); 
    jcomp2.setBounds (135, 60, 100, 25); 
    jcomp3.setBounds (260, 35, 100, 25); 
    jcomp4.setBounds (105, 115, 100, 25); 
} 


public static void main (String[] args) { 
    JFrame frame = new JFrame ("MyPanel"); 
    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().add (new MyPanel2()); 
    frame.pack(); 
    frame.setVisible (true); 
} 
} 

Si alguien pudiera ayudar, ¡lo agradecería muchísimo! Tengo mucho respeto por sus pros porque si usted es un profesional en esto, es probable que sea más inteligente que el 99.9% del mundo. Esto me duele el cerebro.

+14

dejar de tratar las cosas al azar, tomar un descanso, dormir bien por la noche, y luego leer el tutorial de swing: http : //docs.oracle.com/javase/tutorial/uiswing/. Comprenda que un JPanel debe estar encerrado en un JFrame de JDialog para que se muestre en una nueva ventana, y que solo debe tener un método principal en una aplicación. No necesitas dos. –

Respuesta

4

Este es el código para la clase MyPanel, utilice la siguiente:

import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 
import javax.swing.event.*; 

public class MyPanel extends JPanel { 
private JTextField How; 
private JLabel jcomp2; 
private JLabel jcomp3; 
private JButton jcomp4; 

public MyPanel() { 
    //construct components 
    How = new JTextField (1); 
    jcomp2 = new JLabel ("How long were you parked?"); 
    jcomp3 = new JLabel ("Minutes"); 
    jcomp4 = new JButton ("openNewWindow"); 

    jcomp4.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      JFrame frame = new JFrame ("MyPanel"); 
      frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
      frame.getContentPane().add (new MyPanel2()); 
      frame.pack(); 
      frame.setVisible (true); 

     } 
    }); 

    //adjust size and set layout 
    setPreferredSize (new Dimension (315, 85)); 
    setLayout (null); 

    //add components 
    add (How); 
    add (jcomp2); 
    add (jcomp3); 
    add (jcomp4); 

    //set component bounds (only needed by Absolute Positioning) 
    How.setBounds (245, 50, 60, 25); 
    jcomp2.setBounds (35, 30, 185, 50); 
    jcomp3.setBounds (250, 30, 60, 20); 
    jcomp4.setBounds (0, 0, 315, 25); 

     jcomp4.addActionListener(new ActionListener() 
    { 
     public void actionPerformed(ActionEvent e) 
     { 

     } 
    }); 
} 


public static void main (String[] args) { 
    JFrame frame = new JFrame ("MyPanel"); 
    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().add (new MyPanel()); 
    frame.pack(); 
    frame.setVisible (true); 
} 
} 
+0

+1, para otra alternativa :-) –

+4

Los objetos de Swing GUI se deben construir y manipular _ solo_ en el [thread de envío del evento] (http://download.oracle.com/javase/tutorial/uiswing/concurrency/initial.html) . – trashgod

8

Aquí es algo que puede hacer, por esta situación, donde tiene muchos Forms or Windows lo que puede hacer es utilizar un JPanel que puede tenga este CardLayout configurado como LayoutManager y luego puede agregar los dos JPanel s y acceder a ellos con los métodos proporcionados por el mismo.

No use setBounds() al usar Absolute Positioning esta no es realmente la forma correcta de colocar componentes en el contenedor primario. En su lugar, use los métodos setLocation(...) y setSize(...). Considere no usar Posicionamiento Absoluto tanto como sea posible para usted. Ciertas líneas en favor de la antes dicha línea tomada de Docs Java son los siguientes:

Aunque es posible prescindir de un controlador de distribución, se debe utilizar un gestor de diseño si es posible. Un administrador de diseño facilita el ajustarse a las apariencias de componentes dependientes de la apariencia y la sensación, a diferentes tamaños de fuente , al tamaño cambiante de un contenedor ya diferentes configuraciones regionales. Los gestores de diseño también se pueden reutilizar fácilmente en otros contenedores, así como en otros programas .

Dado que la salida de su programa en realidad no es una experiencia relajante en ningún sentido. Atleast LayoutManager, puede hacer que el trabajo sea mucho más fácil para usted, ya que no necesita especificar la posición y el tamaño para cada componente. Intente caminar por el Layout Mangers Tutorials y acostúmbrese a ellos lo antes posible. Son los protectores de la vida real :-)

que aquí hay una versión modificada de la toma de su SOURCE CODE

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class CardLayoutExample 
{ 
    private JPanel contentPane; 
    private MyPanel panel1; 
    private MyPanel2 panel2; 

    private void displayGUI() 
    { 
     JFrame frame = new JFrame("Card Layout Example"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel contentPane = new JPanel(); 
     contentPane.setBorder(
      BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
     contentPane.setLayout(new CardLayout()); 
     panel1 = new MyPanel(contentPane); 
     panel2 = new MyPanel2(); 
     contentPane.add(panel1, "Panel 1"); 
     contentPane.add(panel2, "Panel 2"); 
     frame.setContentPane(contentPane); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new CardLayoutExample().displayGUI(); 
      } 
     }); 
    } 
} 

class MyPanel extends JPanel { 

    private JTextField How; 
    private JLabel jcomp2; 
    private JLabel jcomp3; 
    private JButton jcomp4; 
    private JPanel contentPane; 

    public MyPanel(JPanel panel) { 

     contentPane = panel; 
     //construct components 
     How = new JTextField (1); 
     jcomp2 = new JLabel ("How long were you parked?"); 
     jcomp3 = new JLabel ("Minutes"); 
     jcomp4 = new JButton ("openNewWindow"); 

     //adjust size and set layout 
     setPreferredSize (new Dimension (315, 85)); 
     setLayout (null); 

     //set component bounds (only needed by Absolute Positioning) 
     How.setBounds (245, 50, 60, 25); 
     jcomp2.setBounds (35, 30, 185, 50); 
     jcomp3.setBounds (250, 30, 60, 20); 
     jcomp4.setLocation(0, 0); 
     jcomp4.setSize(315, 25); 
     jcomp4.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
       CardLayout cardLayout = (CardLayout) contentPane.getLayout(); 
       cardLayout.next(contentPane); 
      } 
     }); 

     //add components 
     add (How); 
     add (jcomp2); 
     add (jcomp3); 
     add (jcomp4);    
    } 
} 

class MyPanel2 extends JPanel { 
    private JButton jcomp1; 
    private JButton jcomp2; 
    private JButton jcomp3; 
    private JTextField jcomp4; 

    public MyPanel2() { 
     //construct components 
     jcomp1 = new JButton ("test1"); 
     jcomp2 = new JButton ("test2"); 
     jcomp3 = new JButton ("test3"); 
     jcomp4 = new JTextField (5); 

     //adjust size and set layout 
     setPreferredSize (new Dimension (395, 156)); 
     setLayout (null); 

     //set component bounds (only needed by Absolute Positioning) 
     jcomp1.setBounds (20, 45, 100, 25); 
     jcomp2.setBounds (135, 60, 100, 25); 
     jcomp3.setBounds (260, 35, 100, 25); 
     jcomp4.setBounds (105, 115, 100, 25); 

     //add components 
     add (jcomp1); 
     add (jcomp2); 
     add (jcomp3); 
     add (jcomp4);  
    } 
} 
+2

Ejemplo útil, pero debe guiar OP_away_ para que no use el diseño 'null'. :-) – trashgod

+1

Hecho y gracias de nuevo por señalar :-) –

Cuestiones relacionadas