无法在单个jframe中切换cardlayout中的卡

时间:2014-02-18 13:30:21

标签: java swing jframe jpanel cardlayout

很抱歉,如果它是一个明显的问题。我一直在尝试使用cardlayout在同一个窗口中切换面板。但是当我运行我的应用程序时没有任何反应。     的System.out.println(mntmBookingStatus); 上面的声明确实打印在控制台上。但是当我点击menuitem“预订状态”和“发票录入”时,无法弄清楚为什么卡片没有切换。

public class StartDemo {
private JFrame frame;
private JPanel cards = new JPanel(new CardLayout());
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                StartDemo window = new StartDemo();
                window.initialize();
                window.frame.pack();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}
private void initialize() {
    frame = new JFrame();
    frame.setBounds(100, 100, 772, 700);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //frame.setVisible(true);
    // main menu
    menuBar = new JMenuBar();
    frame.setJMenuBar(menuBar);

    // mainmenuoption-1
    mnNewMenu = new JMenu("Entries");
    menuBar.add(mnNewMenu);

    // option-1 items
    mntmBookingStatus = new JMenuItem("Booking Status");
    mnNewMenu.add(mntmBookingStatus);
    mntmBookingStatus.addActionListener(new MenuListenerAdapter());

mntmInvoiceEntry = new JMenuItem("Invoice Entry");
mnNewMenu.add(mntmInvoiceEntry);
mntmInvoiceEntry.addActionListener(new MenuListenerAdapter());
StartDemo demo = new StartDemo();
    demo.addComponentToPane(frame.getContentPane());

}

public void addComponentToPane(Container pane) {
JPanel booking_status = new JPanel();
    JPanel invoice_entry = new JPanel();
    JPanel customer_ledger = new JPanel();
    JPanel create_user = new JPanel();

    try {

        JPanelWithBackground panelWithBackground = new       JPanelWithBackground(
                "D:\\Kepler Workspace\\WEDemo\\images\\abc.jpg");
        cards.add(panelWithBackground, "name_282751308799");
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

 //the layout code for all the panels is written here.
//its to big to post here

cards.add(booking_status, BOOKINGPANEL);
    cards.add(invoice_entry, INVOICEPANEL);
    cards.add(customer_ledger, CUSTOMERLEDGER);
    cards.add(create_user, CREATEUSER);

    pane.add(cards, BorderLayout.CENTER);

}

public class MenuListenerAdapter implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {

        CardLayout c = (CardLayout) (cards.getLayout());

        if (e.getSource() == mntmBookingStatus) {
            c.show(cards, BOOKINGPANEL);
            System.out.println(mntmBookingStatus);

        } else if (e.getSource() == mntmInvoiceEntry) {
            c.show(cards, INVOICEPANEL);
            System.out.println(mntmInvoiceEntry);

        }

    }

这是我的JPanelWithBackground类

public class JPanelWithBackground extends JPanel {

private Image backgroungImage;
private Image scaledBackgroundImage;


  // Some code to initialize the background image.
  // Here, we use the constructor to load the image. This
  // can vary depending on the use case of the panel.

public JPanelWithBackground(String fileName) throws IOException {
    backgroungImage = ImageIO.read(new File(fileName));
}


public void paintComponent(Graphics g){
    super.paintComponent(g);

    // Draw the backgroung image
    g.drawImage(backgroungImage, 0, 0,getWidth(),getHeight(),null);
}

1 个答案:

答案 0 :(得分:1)

这就是这两行

 StartDemo demo = new StartDemo();
 demo.addComponentToPane(frame.getContentPane());

由于您的initialize()方法不是static,我认为可以安全地假设您在StartDemo方法中再次实例化main 。在这种情况下,上面的代码确实是你的问题,并将完全解释为什么它不起作用。就这样做

 //StartDemo demo = new StartDemo();          <-- get rid of this.
 addComponentToPane(frame.getContentPane());

仅使用代码添加进行测试以使其运行。也请不要上面的评论。 {/ 1}} 添加所有组件之后

setVisible(true)