2016-03-23 21 views
0

Ich versuche, DebtForm.java zu öffnen, wenn die btnAddNewDebt Schaltfläche von IOUApplication.java gedrückt wird. Sobald die Schaltfläche gedrückt wird, sollte das Fenster IOUApplication.java geschlossen werden und das Fenster DebtForm.java sollte geöffnet werden.Öffnen eines neuen JFrames, wenn JButton geklickt wird

Ich habe es geschafft, die DebtForm.java zu öffnen, wenn die btnAddNewDebt Taste gedrückt wird, aber ich bin nicht in der Lage, das IOUApplication.java Fenster zu schließen.

Ich habe versucht, die Verwendung von folgenden:

public void close(){ 
    WindowEvent winClosingEvent = new WindowEvent(this,WindowEvent.WINDOW_CLOS­ING); 
    Toolkit.getDefaultToolkit().getSystemEve­ntQueue().postEvent(winClosingEvent); 
} 

Aber ich bin nicht sicher, wo Sie den Code platzieren oder wenn es irgendwelche anderen alternativen Methoden sind das Fenster zu schließen.

Hier ist ein Ausschnitt aus IOUApplication.java für Kontext:

public void initialize() { 

    frame = new JFrame(); 
    frame.getContentPane().setBackground(Color.DARK_GRAY); 
    frame.setBounds(100, 100, 450, 132); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().setLayout(null); 

    JButton btnAddNewDebt = new JButton("Add new debt"); 
    btnAddNewDebt.addActionListener(new ActionListener() { 

     public void actionPerformed(ActionEvent e) { 
      DebtForm frame = new DebtForm(); 
      frame.setVisible(true); 
     } 
    }); 

    btnAddNewDebt.setBounds(81, 18, 117, 29); 
    frame.getContentPane().add(btnAddNewDebt);  

    JButton btnPersonalDebt = new JButton("Personal Debt"); 
    btnPersonalDebt.setBounds(266, 18, 117, 29); 
    frame.getContentPane().add(btnPersonalDebt); 

    JLabel lblWrittenAndCoded = new JLabel("Written and coded by Samuel Kahessay"); 
    lblWrittenAndCoded.setForeground(Color.WHITE); 
    lblWrittenAndCoded.setBounds(108, 88, 252, 16); 
    frame.getContentPane().add(lblWrittenAndCoded); 
} 
+0

1) Siehe [Die Verwendung mehrerer JFrames, gute/schlechte Praxis?] (Http://stackoverflow.com/q/9554636/418556) 2) Java GUIs müssen auf verschiedenen Betriebssystemen, Bildschirmgröße, Bildschirm arbeiten Auflösung usw. unter Verwendung verschiedener PLAFs in verschiedenen Lokalitäten. Als solche sind sie nicht für ein perfektes Pixel-Layout geeignet. Verwenden Sie stattdessen Layout-Manager oder [Kombinationen davon] (http://stackoverflow.com/a/5630271/418556) zusammen mit Layout-Auffüllung und Rahmen für [Leerraum] (http://stackoverflow.com/a/17874718/ 418556). 3) Um eine bessere Hilfe zu erhalten, sollten Sie ein [MCVE] oder [Short, Self Contained, Correct Example] (http://www.sscce.org/) veröffentlichen. –

+0

Was ist falsch mit ['Window # dispose'] (https://docs.oracle.com/javase/7/docs/api/java/awt/Window.html#dispose()) oder [' Window # setVisible'] (https://docs.oracle.com/javase/7/docs/api/java/awt/Window.html#setVisible(boolean))? Vielleicht werfen Sie einen Blick auf [Die Verwendung mehrerer JFrames, gute/schlechte Praxis?] (Http://stackoverflow.com/questions/9554636/the-use-of-multiple-jframes-good-bad-practice) und für eine Alternativ werfen Sie einen Blick auf [How To Use CardLayout] (http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html) – MadProgrammer

+0

Vermeiden Sie die Verwendung von 'null' Layouts, Pixel perfekte Layouts sind eine Illusion innerhalb der Moderne UI Design. Es gibt zu viele Faktoren, die die individuelle Größe von Komponenten beeinflussen, von denen Sie keine kontrollieren können. Swing wurde entwickelt, um mit Layout-Managern im Kern zu arbeiten. Wenn man diese wegwirft, führt das zu keinem Ende der Probleme und Probleme, die man immer mehr Zeit damit verbringen wird, zu korrigieren. – MadProgrammer

Antwort

0

Um die JFrame zu schließen, alles, was Sie tun müssen, um Anruf frame.dispose ist(). Diese Methode wird den JFrame im Speicher vollständig entfernen. Wenn Sie das Fenster später erneut öffnen möchten, müssen Sie nur noch frame.setVisible (false) und dann frame.setVisible (true) eingeben, wenn Sie es erneut öffnen möchten. Sie müssen Ihren JFrame möglicherweise zu einer globalen Variable machen, um dies zu tun. Unter der Annahme, dass der Code, den Sie für DebtForm schrieben() seine eigene JFrame erstellen funktioniert, hier ist, wie es aussieht:

public void initialize() { 

/* Your same code */ 
frame = new JFrame(); 
frame.getContentPane().setBackground(Color.DARK_GRAY); 
frame.setBounds(100, 100, 450, 132); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
frame.getContentPane().setLayout(null); 

JButton btnAddNewDebt = new JButton("Add new debt"); 
btnAddNewDebt.addActionListener(new ActionListener() { 

    public void actionPerformed(ActionEvent e) { 
     DebtForm debtForm = new DebtForm(); 
     debtForm.setVisible(true); 
     /* THE ONLY NEW LINE OF CODE */ 
     frame.setVisible(false); //This will make the first window disapear. 
     /* ------------------------- */ 
    } 
}); 

btnAddNewDebt.setBounds(81, 18, 117, 29); 
frame.getContentPane().add(btnAddNewDebt);  

JButton btnPersonalDebt = new JButton("Personal Debt"); 
btnPersonalDebt.setBounds(266, 18, 117, 29); 
frame.getContentPane().add(btnPersonalDebt); 

JLabel lblWrittenAndCoded = new JLabel("Written and coded by Samuel Kahessay"); 
lblWrittenAndCoded.setForeground(Color.WHITE); 
lblWrittenAndCoded.setBounds(108, 88, 252, 16); 
frame.getContentPane().add(lblWrittenAndCoded); 
} 

Später, um das ursprüngliche Fenster wieder erscheinen zu machen, außerhalb der Methode initialize() Sie müssen „Rahmen“ wie folgt erklären:

public static JFrame frame = new JFrame(); 

Jetzt in Ihrem DebtForm.java, können Sie den Rahmen wieder sichtbar wie diese machen:

IOUApplication.frame.setVisible(true); 

ich hoffe, das hilft. Danke für das Lesen!

+0

Danke! Genau das habe ich gesucht. –

Verwandte Themen