JAVA對於單視窗和多個JPanel面板的切換
阿新 • • 發佈:2018-12-14
寫一個簡單的2048遊戲時,本來思路是想對於每個遊戲介面進行一次new JFrame,並在新視窗中新增元件,將舊視窗用setVisible(false)進行隱藏。但是這樣寫出現了一個問題,就是開啟其他視窗介面會導致之前的部分介面出現無法關閉或者隱藏的情況,因為本來的設想是在新視窗開啟後,對之前舊視窗隱藏,但是還是在某些介面切換時出現無法將舊介面全部隱藏,改了也改不掉。後來,經過老師看了一下程式碼,說對於一個需要介面的程式,只建立一個JFrame視窗,對於其他的元件和介面寫成一個JPanel面板,寫好之後把面板往這個視窗中新增,需要新介面時,將原來的面板隱藏,天新增新的面板。
按照這個思路找了個樣例,又發現了一個問題:如果只向一個視窗中不斷新增面板,但是事件監聽在當前面板上,新增新面板得話還得new一個新的視窗,然後問了問別人,得到了一個新的思路,就是將JFrame視窗傳遞到其他面板之中,這樣就能一直在一個視窗中新增不同的面板。
以下是根據該思路寫的四段測試程式碼,這種方法只建立一個視窗,通過按鈕時間在兩個面板之間切換:
public class JavaApplication13 {
public static void main(String[] args) {
NewJFrame n2=new NewJFrame();//建立一個視窗
NewJPanel p2=new NewJPanel(n2);//建立一個面板,並將視窗傳入
n2.add(p2);//視窗中新增面板p2
n2.setVisible(true);//顯示視窗
}
}
//視窗 import java.awt.FlowLayout; import javax.swing.JFrame; import javax.swing.JPanel; public class JavaApplication13 { public static void main(String[] args) { NewJFrame n2=new NewJFrame();//建立一個視窗 NewJPanel p2=new NewJPanel(n2);//建立一個面板,並將視窗傳入 n2.add(p2);//視窗中新增面板p2 n2.setVisible(true);//顯示視窗 } }
//面板2中除了按鈕名稱和麵板1不一樣,其他基本功能相同 //面板1 public class NewJPanel extends javax.swing.JPanel { /** * Creates new form NewJPanel */ NewJFrame n2=null; public NewJPanel(NewJFrame n2) { initComponents(); this.n2=n2;//通過建構函式接收之前傳過來的面板 } @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { jButton1 = new javax.swing.JButton();//新增按鈕 jButton1.setText("測試1"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); NewJPanel2 p1=new NewJPanel2(n2);//新建面板NewJPanel2,並將視窗n2傳入 setVisible(false);//隱藏當前面板 n2.add(p1);//在視窗中新增面板p1 n2.setVisible(true);//顯示面板 } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(115, 115, 115) .addComponent(jButton1) .addContainerGap(188, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(84, 84, 84) .addComponent(jButton1) .addContainerGap(187, Short.MAX_VALUE)) ); }// </editor-fold> private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: } // Variables declaration - do not modify private javax.swing.JButton jButton1; // End of variables declaration }
//面板2
public class NewJPanel2 extends javax.swing.JPanel {
/**
* Creates new form NewJPanel
*/
NewJFrame n2=null;
public NewJPanel2(NewJFrame n2) {
initComponents();
this.n2=n2;
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jButton1 = new javax.swing.JButton();
jButton1.setText("測試2");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
NewJPanel p=new NewJPanel(n2);
setVisible(false);
n2.add(p);
n2.setVisible(true);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(115, 115, 115)
.addComponent(jButton1)
.addContainerGap(188, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(84, 84, 84)
.addComponent(jButton1)
.addContainerGap(187, Short.MAX_VALUE))
);
}// </editor-fold>
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
// End of variables declaration
}