带有MouseListener的CardLayout无法正常工作

时间:2014-04-10 23:21:25

标签: java swing jframe mouselistener cardlayout

我正在处理CardLayout。我添加为JPanel内容窗格的JFrame有一个CardLayout,我想在不同的窗格之间切换。我有一个工作窗格,其中包含按钮和教程的其他五个图像窗格,仅当某个布尔值为true时才会显示。我的意思是,每次将此布尔值设置为true时,应使用next()方法完成五次交换。我的问题是,在第一次交换后,屏幕变为空白。为什么会这样?

第二个问题。我使用MouseListener进行交换,但我希望程序在一段时间后自动执行。我尝试使用Thread.sleep(5000),但我得到了黑屏。

这是我的代码,其中card是一个类变量,以便在Mouselistener中使用它,parent是工作面板,已经创建,ImagePanel是一个类创建tutorialPanels,在其下面添加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
    }

这是mouselistener:

//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) {
    }
}

我知道监听器被执行是因为我检查了它。 任何帮助将不胜感激,谢谢你。

1 个答案:

答案 0 :(得分:0)

  

“但我希望程序在一段时间后自动完成。我尝试使用Thread.sleep(5000)”

不要使用Thread.sleep。而是使用javax.swing.Timer。您可以在How to Use Swing Timers

了解详情

这是一个简单的示例,使用您的一些应用格式。

enter image description here

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