2012-06-30 23 views
6

Sono stato seduto qui al computer per circa 13 ore e penso che i miei occhi stiano sanguinando. Ho trovato un piccolo editor di gui che amo chiamato GuiGenie. Funziona perfettamente per creare la finestra con i pulsanti e tutte quelle cose buone. Il problema è che voglio fare clic su un pulsante nel mio primo menu e aprire il mio altro menu che ho creato. Ho appena iniziato la programmazione 4 settimane fa quindi sono un noob completo. Ho la sensazione sua rovinare a causa dei metodi principali, ma non ho idea e 13 ore di seduta qui cercando milioni di cose mi sta facendo impazzire:) qui è quello che ho ottenuto finoraJava Aprire una nuova finestra facendo clic su un pulsante

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); 
} 
} 

Quando si preme il pulsante, voglio che apra questa nuova finestra

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); 
} 
} 

Se qualcuno potesse aiutare lo apprezzerei molto !! Ho molto rispetto per voi professionisti là fuori perché se siete dei professionisti in questo, probabilmente siete più intelligenti del 99,9% del mondo. Questa roba mi fa male al cervello.

+14

Smettere di cercare le cose a caso, fare una pausa, un buon riposo notturno, e quindi leggere il tutorial swing: http : //docs.oracle.com/javase/tutorial/uiswing/. Comprendi che un JPanel deve essere racchiuso in un JFrame di JDialog per essere mostrato in una nuova finestra e che devi avere solo un metodo principale in un'applicazione. Non hai bisogno di due. –

risposta

4

Ecco il codice per la classe myPanel, utilizzare questo:

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, per un'altra alternativa :-) –

+4

Gli oggetti GUI Swing devono essere costruiti e modificati _solo_ sul [thread di invio eventi] (http://download.oracle.com/javase/tutorial/uiswing/concurrency/initial.html) . – trashgod

8

Qui è qualcosa che si può fare, per questa situazione, in cui si dispone di più Forms or Windows cosa si può fare è quello di utilizzare un JPanel che può avere questo CardLayout impostato come è LayoutManager e quindi è possibile aggiungere i due JPanel s ad esso e accedervi con i metodi forniti dallo stesso.

Non utilizzare setBounds() quando si utilizza Absolute Positioning questo non è davvero il modo corretto di inserire componenti nel contenitore padre. Utilizzare invece i metodi setLocation(...) e setSize(...). Considera di non utilizzare il posizionamento assoluto il più possibile per te. Alcune linee a favore della prima detto linea adottata da Java Docs sono i seguenti:

Anche se è possibile fare a meno di un gestore di layout, è necessario utilizzare un gestore di di layout, se possibile. Un gestore di layout semplifica l'adattamento di alle apparenze di componenti look-and-feel-dipendenti, a diverse dimensioni di font , a dimensioni variabili di un contenitore ea diverse impostazioni internazionali. I gestori di layout possono essere riutilizzati facilmente anche da altri contenitori, nonché da altri programmi.

Poiché l'output del programma in realtà non è un'esperienza rilassante in alcun senso. Atleast LayoutManager, può rendere questo lavoro molto più semplice per te, dal momento che non è necessario specificare la posizione e le dimensioni per ogni singolo componente. Prova a camminare attraverso il Layout Mangers Tutorials, e abituarti a loro il più presto possibile. Essi sono i veri risparmiatori vita :-)

Questo vuole essere un codice modificato presi dal 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

Esempio utile, ma si dovrebbe guidare l'OP _away_ dall'uso del layout 'null'. :-) – trashgod

+1

Fatto e grazie ancora per la precisazione :-) –

Problemi correlati