【发布时间】:2015-07-02 14:50:38
【问题描述】:
我有一个 Swing GUI,它使用带有两张卡片的 CardLayout:
主卡
过道卡
当我进入 aisle_card 时,它会正确切换到 aisle_card 并关闭 main_card:
public class Runner
{
private static JFrame frame;
private static JPanel cards;
void createAndShowGUI()
{
//ItemsInAisleGUI gui = new ItemsInAisleGUI();
// Create and set up the window.
ItemsInAisleGUI gui = new ItemsInAisleGUI();
frame = new JFrame("Shopping List");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
cards = new JPanel(new CardLayout());
JPanel mainCard = buildMainPanel();
//JPanel aisleCard = new ItemsInAisleGUI(mainCard).aisleCard;
JPanel aisleCard = gui.createAndShowGUI();
cards.add(mainCard, MAIN_CARD);
cards.add(aisleCard, AISLE_CARD);
// Display the window.
frame.getContentPane().add(cards);
frame.pack();
frame.setVisible(true);
}
private JPanel buildMainPanel()
{
JPanel mainCard = new JPanel();
mainCard.setLayout(new GridLayout());
mainCard.setName(MAIN_CARD);
JPanel topRowPanel = new JPanel();
topRowPanel.setLayout(new GridLayout(12, 2));
topRowPanel.setName("TopRowPanel");
//Button for the Search by Aisle Card
JButton aisleButton = new JButton("\u25BA Search by Aisle");
aisleButton.setName(AISLE_BUTTON);
aisleButton.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
CardLayout cl = (CardLayout) (cards.getLayout());
cl.show(cards, AISLE_CARD);
}
});
//panels and labels of mainCard
mainCard.add(topRowPanel);
return mainCard;
}
public static void main(String[] args)
{
javax.swing.SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
Runner r = new Runner();
r.createAndShowGUI();
}
});
}
/**
* @return the frame containing the application view
*/
static JFrame getFrame()
{
return frame;
}
/**
* @return the card that is current visible
*/
Component getVisibleCard()
{
for (int i = 0; i < cards.getComponentCount(); i++)
{
if (cards.getComponent(i).isVisible())
{
return cards.getComponent(i);
}
}
return null;
}
}
但是,当我在 aisle_card 中并想返回时,它确实打开了 main_card 但没有关闭 aisle_card,并且控制台显示 NPE:
线程“AWT-EventQueue-0”中的异常 java.lang.NullPointerException 在 view.ItemsInAisleGUI$2.CloseFrame(ItemsInAisleGUI.java" 指 到这一行 jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
public class ItemsInAisleGUI {
private static JFrame jFrame;
public ItemsInAisleGUI() {
}
public JPanel createAndShowGUI()
{
JPanel content = new JPanel();
content.setLayout(new GridLayout(2, 1));
content.setName("aislePanel");
//panel stuff
backButton = new JButton("\u25C4 Back to Item Search");
backButton.setName("BackButton");
//button for going back to the main screen (Search by Item Name)
backButton.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
Runner myrunner = new Runner();
myrunner.createAndShowGUI();
CloseFrame();
}
public void CloseFrame(){
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setVisible(false);
}
});
topRowPanel.add(aisleNumberLabel);
topRowPanel.add(aisleNumberText);
topRowPanel.add(itemsInAisleLabel);
topRowPanel.add(itemsInAisleText);
topRowPanel.add(searchItemButton);
topRowPanel.add(backButton);
content.add(topRowPanel);
return content;
}
public static Container getContainer()
{
return jFrame;
}
/**
* @param args
*/
public static void main(String[] args)
{
}
}
有什么建议吗?谢谢。
【问题讨论】:
-
这可能不是你问题的症结所在,但是你有没有将过道按钮添加到父组件中?
-
这意味着变量
jFrame为空。我看不到您将此变量设置为 null 的任何地方(甚至就此而言,它被声明为类JFrame的实例。所以我认为问题可能出在您尚未提出的其他代码中。 -
@NoseKnowsAll 我忘了提到我在 ItemsinAisleGUI 类中声明了
private static JFrame jFrame。