Java 带鼠标侦听器的卡片布局不工作

Java 带鼠标侦听器的卡片布局不工作,java,swing,jframe,mouselistener,cardlayout,Java,Swing,Jframe,Mouselistener,Cardlayout,我在处理卡片布局。作为内容窗格添加到JFrame的JPanel有一个CardLayout,我想在不同的窗格之间交换。我有一个带有按钮的工作窗格和其他五个用于教程的图像窗格,只有当某个布尔值为true时才会显示这些窗格。我的意思是,每次这个布尔值被设置为真时,应该使用下一种方法进行五次交换。我的问题是,在第一次交换之后,屏幕变成空白。为什么会发生这种情况 第二个问题。我正在使用MouseListener进行交换,但我希望程序在一段时间后自动进行交换。我试着用Thread.sleep5000,但我的

我在处理卡片布局。作为内容窗格添加到JFrame的JPanel有一个CardLayout,我想在不同的窗格之间交换。我有一个带有按钮的工作窗格和其他五个用于教程的图像窗格,只有当某个布尔值为true时才会显示这些窗格。我的意思是,每次这个布尔值被设置为真时,应该使用下一种方法进行五次交换。我的问题是,在第一次交换之后,屏幕变成空白。为什么会发生这种情况

第二个问题。我正在使用MouseListener进行交换,但我希望程序在一段时间后自动进行交换。我试着用Thread.sleep5000,但我的屏幕是黑色的

这是我的代码,其中card是一个类变量,用于在Mouselistener中使用它,parent是已经创建的工作面板,ImagePanel是一个用于创建教程面板的类,它在下面添加了Mouselistener。此外,rootPane是一个类窗格

card = new CardLayout();
    rootPane = new JPanel(card);
    this.getContentPane().add(rootPane);
    //create panels to add
    ImagePanel inputTutorial = new ImagePanel("backgroundIn.png");
    ImagePanel numericTutorial = new ImagePanel("backgroundNum");
    ImagePanel outputTutorial = new ImagePanel("backgroundOut");
    ImagePanel commandTutorial = new ImagePanel("backgroundCom");
    ImagePanel errorTutorial = new ImagePanel("backgroundErr");
    ImagePanel finalTutorial = new ImagePanel("backgroundFinal");
    //add  the panels
    rootPane.add(parent);
    rootPane.add(inputTutorial);
    rootPane.add(numericTutorial);
    rootPane.add(outputTutorial);
    rootPane.add(commandTutorial);
    rootPane.add(errorTutorial);
    rootPane.add(finalTutorial);
    //set rootPane content panel
    this.getContentPane().add(rootPane);
    //if the boolean is true
    if (firstTime == true) {
        card.next(rootPane);
        //other swaps done by mouselisteners
    }
这是鼠标听筒:

//mouse click listener
private class MouseActionListener implements MouseListener {
    public void mousePressed (MouseEvent e) {
    }

    @Override
    public void mouseClicked(MouseEvent arg0) {
            card.next(rootPane);
    }

    @Override
    public void mouseEntered(MouseEvent arg0) {
    }

    @Override
    public void mouseExited(MouseEvent arg0) {
    }

    @Override
    public void mouseReleased(MouseEvent arg0) {
    }
}
我知道监听器被执行了,因为我检查了它。 任何帮助都将不胜感激,提前谢谢你

但我希望程序在一段时间后自动完成。我试着用Thread.sleep5000

不要使用线程。睡眠。而是使用javax.swing.Timer。你可以在

下面是一个简单的例子,使用一些应用程序格式

import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class SlideShow {

    public SlideShow() {
        final CardLayout layout = new CardLayout();
        final JPanel mainPanel = createMainPanel(layout);

        Timer timer = new Timer(1000, new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                layout.next(mainPanel);
            }
        });
        timer.start();

        JFrame frame = new JFrame();
        frame.add(mainPanel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private JPanel createMainPanel(CardLayout layout) {
        JPanel panel = new JPanel(layout);
        panel.add(new ImagePanel("mario.png"));
        panel.add(new ImagePanel("bowser.png"));
        panel.add(new ImagePanel("luigi.png"));
        panel.add(new ImagePanel("koopa.png"));
        panel.add(new ImagePanel("princess.png"));
        return panel;
    }

    private class ImagePanel extends JPanel {

        BufferedImage image;

        public ImagePanel(String fileName) {
            try {
                image = ImageIO.read(getClass().getResource("/marioblobs/" + fileName));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

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

        @Override
        public Dimension getPreferredSize() {
            return image == null ? new Dimension(200, 200) 
                    : new Dimension(image.getWidth(), image.getHeight());
        }
    }

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

事实上,我尝试使用Thread.sleep5000,但我得到了黑屏——不要使用Thread.sleep。看谢谢你,真的很有用的计时器帮助,但我还是得到了第二次交换的空白屏幕。有什么建议吗@Peeskilletlook查看发布的代码,只有第一个ImagePanel传递了.png文件扩展名。这可能就是问题所在。哦,不!我不敢相信我犯了这么愚蠢的错误。。。这就是为什么我的屏幕是空白的!谢谢你宝贵的帮助!