這是我的代碼。在展示之前設計的框架(添加了面板)時,我沒有任何問題。將面板動態添加到空JFrame時遇到此問題。動態添加JPanels不會顯示在Swing中
package com.mytunes.controllers;
import com.mytunes.views.*;
import com.mytunes.views.panels.*;
import java.awt.BorderLayout;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
public class GUIController {
ArrayList<JFrame> displayFrames = new ArrayList<JFrame>();
JPanel displayPanel;
HeaderPanel headerPanel = new HeaderPanel();
FooterPanel footerPanel = new FooterPanel();
public int showFrame(String frameName, Object controller){
Class c;
Constructor ctr;
int lastFrame = -1;
try {
// call a class dynamically
c = Class.forName("com.mytunes.views.frames." + frameName + "Frame");
// calll a constructor of a class
ctr = c.getConstructor(SessionController.class);
// instantiate dynamically created class
displayFrames.add((JFrame) ctr.newInstance(controller));
// get the index of frame just added
lastFrame = displayFrames.size()-1;
displayFrames.get(lastFrame).setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
displayFrames.get(lastFrame).pack();
displayFrames.get(lastFrame).setLocationRelativeTo(null);
// hide it by default.
displayFrames.get(displayFrames.size()-1).setVisible(false);
} catch (InstantiationException ex) {
Logger.getLogger(GUIController.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
Logger.getLogger(GUIController.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalArgumentException ex) {
Logger.getLogger(GUIController.class.getName()).log(Level.SEVERE, null, ex);
} catch (InvocationTargetException ex) {
Logger.getLogger(GUIController.class.getName()).log(Level.SEVERE, null, ex);
} catch (NoSuchMethodException ex) {
Logger.getLogger(GUIController.class.getName()).log(Level.SEVERE, null, ex);
} catch (SecurityException ex) {
Logger.getLogger(GUIController.class.getName()).log(Level.SEVERE, null, ex);
} catch (ClassNotFoundException ex) {
JOptionPane.showMessageDialog(null, "Error while loading class 'com.mytunes.view.frames." + frameName + "'");
}
System.out.println(lastFrame);
return lastFrame;
}
//-------------show panels --------------//
public void showOperator(String frame, Object controller){
// this works fine! this frame is already having Panels
int f = showFrame(frame, controller);
displayFrames.get(f).setVisible(true);
}
public void showEnterPIN(String frame, Object controller){
int f = showFrame(frame, controller);
displayFrames.get(f).getContentPane().add(new EnterPINPanel(), BorderLayout.CENTER);
displayFrames.get(f).setVisible(true);
// Try every following ways to show the "Dynamically added" panels
// displayFrames.get(f).getContentPane().removeAll();
// displayFrames.get(f).getContentPane().invalidate();
// displayFrames.get(f).getContentPane().add(new EnterPINPanel(), BorderLayout.PAGE_START);
// displayFrames.get(f).getContentPane().validate();
// displayFrames.get(f).pack();
// displayFrames.get(f).setVisible(true);
}
}
欣賞是否有人能夠發現我這個問題。謝謝。
查看**編輯2 **在我的回答下面 –