2016-12-05 52 views
-2

我有2 JFrame s f1f2都分別有按鈕b1b2如何關閉以前的JFrames,同時打開新的?

如果b1被點擊它打開f2並且如果被點擊b2它打開f1按鈕b1b2開關幀,即。

我想我的程序試圖打開一個新的JFrame時關閉以前JFrame,即如果被點擊B1應該關閉/隱藏f1和開放f2,反之亦然。我試過setVisible(false),但它似乎並不奏效。

我很感激任何幫助或建議。

這裏是我的代碼:

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

public class m extends JFrame implements ActionListener 
{ 
    static JFrame f1,f2; 
    static JButton b1,b2; 

    public m() 
    { 
     f1(); 
    } 

    public void f1() 
    { 
     JFrame f1=new JFrame("frame 1"); 
     JButton b1=new JButton("frame 2"); 

     JLabel l1=new JLabel("FRAME 1"); 

     f1.setSize(600,600); 
     b1.setBounds(300,300,100,100); 
     l1.setBounds(300,150,100,100); 
     b1.addActionListener(this); 
     f1.add(b1); 
     f1.add(l1); 
     f1.setVisible(true); 
     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    } 

    public void f2() 
    { 
     JFrame f2=new JFrame("frame 2"); 
     JButton b2=new JButton("frame 1"); 
     JLabel l2=new JLabel("FRAME 2"); 
     f2.setSize(600,600); 
     b2.setBounds(300,300,100,100); 
     l2.setBounds(300,150,100,100); 
     b2.addActionListener(this); 
     f2.add(b2); 
     f2.add(l2); 
     f2.setVisible(true); 

     setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
    } 

    public static void main(String args[]) 
    { 
     new m(); 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
     String bt=String.valueOf(e.getActionCommand()); 
     if(bt=="frame 2") 
     { 
      f1.setVisible(false); 
      f2(); 
     } 
     else if(bt=="frame 1") 
     { 
      f2.setVisible(false); 
      f1(); 
     } 
    } 
} 
+1

的可能的複製[如何比較Java中的字符串?](http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java) – Frakcool

+0

@Mdlc當你批准建議的編輯時,請確保沒有任何東西否則要改進,在Doron的編輯中還有一些需要改進的地方,例如代碼格式! – Frakcool

+0

@DoronYakovlevGolani請修正代碼格式,當你建議編輯改進一切,你可以在一個單一的編輯:) – Frakcool

回答

4

有在你的代碼的多個錯誤:

  1. 縮進,你應該正確縮進它,所以它更易於閱讀

  2. 你」請重新設置組件邊界,而不是使用適當的Layout manager,請參閱:Null layout is evilWhy is it frowned upon to use null layout in swing?,同時使用空佈局和設置綁定似乎是創建複雜GUI的最好也是最簡單的方法,但事實並非如此,因此Swing必須以不同的屏幕尺寸,分辨率和PLAF工作,否則將來會遇到麻煩。

  3. 您正在擴展JFrame並創建一個JFrame對象,並且將它們混合在一起,留下其中一個。我建議後者,因爲否則當你延長時,你說你的班級JFrame,如果你需要擴展一些東西,可以從JPanel擴展。

  4. 不要使用多個JFrame S,請參見:The use of multiple JFrames, good/bad practice?(BAD),你可能想使用JDialogsCard Layout

  5. 你比較String s的==,而不是與.equals()試試!請參閱:How do I compare Strings in Java?

  6. 你有你從未使用靜態成員和JFrameJButton不應是靜態的實際!

  7. 這條線:setDefaultCloseOperation(DISPOSE_ON_CLOSE);這一個setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);不工作在f2f1框架,而是由你的extends

  8. 產生你不把你的程序在EDT

  9. 在框架上

在一個簡單的程序中,你有所有這些錯誤!因此,我建議您在使用GUI之前回到Java基礎知識,這些GUI使程序更復雜,更難以學習基礎知識。

現在不得不說上面的錯誤,如果你有2個JFrame小號堅持:

//Create both frames 

JFrame frame1 = new JFrame("Frame1"); 
JFrame frame2 = new JFrame("Frame2"); 

//Add your buttons using a proper layout manager as suggested above 
... 
//Later in your code in your actionPerformed: 
if (e.getSource.equals(b1)) { 
    //To close the frame w/o exiting application 
    frame1.dispose(); 
    frame2 = new JFrame("Frame2"); //Or call the method that creates this JFrame 

    //To toggle frame visibility and not closing it 
    frame1.setVisible(false); 
    frame2.setVisible(true); 
} else if (e.getSource.equals(b2)) { 
    //To close the frame w/o exiting application 
    frame2.dispose(); 
    frame1 = new JFrame("Frame2"); //Or call the method that creates this JFrame 

    //To toggle frame visibility and not closing it 
    frame2.setVisible(false); 
    frame1.setVisible(true); 
} 

這是主要的想法,僅供參考,檢查this answer和鏈接和重複的問題有太多

+0

添加布局到框架解決了我的問題。感謝您的幫助 –

+0

@Gk然後不要忘記接受答案,如果這有助於你^^ – Frakcool