很抱歉,如果这是一个明显的问题。我一直在尝试使用cardlayout在同一窗口中切换面板。但是当我运行我的应用程序时,什么都没有发生。
    System.out.println(mntmBookingStatus);
上面的声明确实会打印在console。上,但是当我单击菜单项“预订状态”和“发票输入”时,无法弄清为什么卡没有切换。

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);
}

最佳答案

这是这两行

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


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

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


经过添加代码的测试,只是为了使其运行。也请不要在上面我的评论。 setVisible(true)通常是添加所有组件后应该做的最后一件事。

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class StartDemo {

    private JFrame frame;
    private JPanel cards = new JPanel(new CardLayout());
    JMenuBar menuBar;
    JMenu mnNewMenu;
    JMenuItem mntmBookingStatus;
    JMenuItem mntmInvoiceEntry;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                new StartDemo().initialize();
            }
        });
    }

    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 772, 700);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // 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());

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

        frame.setVisible(true);

    }

    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(
                    "/resources/stackoverflow5.png");
            cards.add(panelWithBackground, "name_282751308799");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        cards.add(booking_status, "booking");
        cards.add(invoice_entry, "invoice");
        //cards.add(customer_ledger, CUSTOMERLEDGER);
        //cards.add(create_user, CREATEUSER);

        pane.add(cards, BorderLayout.CENTER);

    }


    class JPanelWithBackground extends JPanel {
        Image img;
        public JPanelWithBackground(String path) throws IOException {
            img = ImageIO.read(getClass().getResource(path));
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(300, 300);
        }
    }

    public class MenuListenerAdapter implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {

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

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

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

            }

        }
    }
}

07-27 19:37