Java 带鼠标侦听器的卡片布局不工作
我在处理卡片布局。作为内容窗格添加到JFrame的JPanel有一个CardLayout,我想在不同的窗格之间交换。我有一个带有按钮的工作窗格和其他五个用于教程的图像窗格,只有当某个布尔值为true时才会显示这些窗格。我的意思是,每次这个布尔值被设置为真时,应该使用下一种方法进行五次交换。我的问题是,在第一次交换之后,屏幕变成空白。为什么会发生这种情况 第二个问题。我正在使用MouseListener进行交换,但我希望程序在一段时间后自动进行交换。我试着用Thread.sleep5000,但我的屏幕是黑色的 这是我的代码,其中card是一个类变量,用于在Mouselistener中使用它,parent是已经创建的工作面板,ImagePanel是一个用于创建教程面板的类,它在下面添加了Mouselistener。此外,rootPane是一个类窗格Java 带鼠标侦听器的卡片布局不工作,java,swing,jframe,mouselistener,cardlayout,Java,Swing,Jframe,Mouselistener,Cardlayout,我在处理卡片布局。作为内容窗格添加到JFrame的JPanel有一个CardLayout,我想在不同的窗格之间交换。我有一个带有按钮的工作窗格和其他五个用于教程的图像窗格,只有当某个布尔值为true时才会显示这些窗格。我的意思是,每次这个布尔值被设置为真时,应该使用下一种方法进行五次交换。我的问题是,在第一次交换之后,屏幕变成空白。为什么会发生这种情况 第二个问题。我正在使用MouseListener进行交换,但我希望程序在一段时间后自动进行交换。我试着用Thread.sleep5000,但我的
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文件扩展名。这可能就是问题所在。哦,不!我不敢相信我犯了这么愚蠢的错误。。。这就是为什么我的屏幕是空白的!谢谢你宝贵的帮助!