2016-03-23 26 views
0

btnAddNewDebt düğmesine IOUApplication.java numaralı tuşa basıldığında açmaya çalışıyorum. Düğmeye basıldıktan sonra IOUApplication.java penceresi kapanmalı ve DebtForm.java penceresi açılmalıdır.JButton tıklandığında yeni bir JFrame açılıyor

DebtForm.java'u btnAddNewDebt düğmesine basıldığında açmayı başardım, ancak IOUApplication.java penceresini kapatamıyorum.

aşağıdaki kullanarak denedim:

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

Yine de kod nereye yerleştirileceğini emin değilim ya da başka bir alternatif yöntemler varsa pencereyi kapatmak için.

İşte bağlam için IOUApplication.java bir parçacık İşte: JFrame kapatmak için

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) Bkz. [Birden Fazla JFram Kullanılması, İyi/Kötü Uygulama?] (Http://stackoverflow.com/q/9554636/418556) 2) Java GUI'lerinin farklı işletim sistemi, ekran boyutu, ekran üzerinde çalışması gerekir. farklı lokallerde farklı PLAF kullanarak çözünürlük vb. Bu nedenle, piksel mükemmel düzenine elverişli değildir. Bunun yerine düzen yöneticileri veya [bunların kombinasyonları] (http://stackoverflow.com/a/5630271/418556), [beyaz alan] için düzen dolguları ve kenarlıkları ile birlikte kullanın (http://stackoverflow.com/a/17874718/ 418.556). 3) Daha iyi yardım için, daha önce bir [MCVE] veya [Kısa, Kendini İçeren, Doğru Örnek] (http://www.sscce.org/) gönderin. –

+0

['Window # dispose'] ile ilgili sorun nedir? (Https://docs.oracle.com/javase/7/docs/api/java/awt/Window.html#dispose()) veya [' Window # setVisible'] (https://docs.oracle.com/javase/7/docs/api/java/awt/Window.html#setVisible(boolean))? Belki de [Çoklu JFramların Kullanımı, İyi/Kötü Uygulama?] (Http://stackoverflow.com/questions/9554636/the-use-of-multiple-jframes-good-bad-practice) ve alternatif [CardLayout Nasıl Kullanılır] 'a bakabilirsiniz (http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html) – MadProgrammer

+0

'null' düzeni kullanmaktan kaçının, pixel mükemmel düzenler modern bir yanılsamadır UI tasarımı. Bileşenlerin bireysel büyüklüğünü etkileyen çok fazla faktör vardır, bunların hiçbiri kontrol edemezsiniz. Swing, düzen yöneticileri ile birlikte çalışmak için tasarlandı, bunları atmak, sorunların ve sorunların hiçbir şekilde sonlanmasına neden olacak ve – MadProgrammer

cevap

0

, yapmanız gereken tüm çağrı frame.dispose() 'dir. Bu yöntem tamamen JFrame bellekten kurtulacaktır. Daha sonra pencereyi yeniden açmak isterseniz, yapmanız gereken tek şey, frame.setVisible (false) ve sonra yeniden açmak istediğinizde frame.setVisible (true). Bunu yapmak için JFrame'inizi global bir değişken yapmak zorunda kalabilirsiniz. senin initialize() yöntemi dışında, orijinal pencerenin yeniden görünmesi amacıyla,

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

Sonra: Eğer DebtForm() için yazdığı kod burada, kendi JFrame var oluşturmak için çalıştığını varsayarsak göründüğü gibi değildir böyle "çerçeve" ilan etmek gerekir: sizin DebtForm.java Şimdi

public static JFrame frame = new JFrame(); 

, böyle tekrar görünür çerçeve yapabilirsiniz:

IOUApplication.frame.setVisible(true); 

umarım bu yardımcı olur. Okuduğunuz için teşekkürler!

+0

'u düzeltmeye çalışmak için daha fazla zaman harcayacağınız için teşekkür ederiz! Tam olarak aradığım şey bu. –