java - 在卡片布局中更改当前卡片,在 Swing 中使用滑动效果

标签 java swing cardlayout

我正在尝试使用幻灯片效果更改当前在卡片布局中可见的内容。但是我在幻灯片的开头看到了一个我无法调试/解决的问题。我怎样才能避免这种轻弹?

这里是重现错误的示例代码:

import java.awt.CardLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Main {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel(new CardLayout());
        JLabel label1 = new JLabel("Harry Joy");
        panel.add(label1, "1");
        JLabel label2 = new JLabel("Harsh Raval");
        panel.add(label2, "2");
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(500L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            label2.setLocation(label1.getX() + 10 - label1.getWidth(), label1.getY());
            label1.setLocation(label1.getX() + 10, label1.getY());
            label2.setVisible(true);
        }
        label2.setVisible(false);
        CardLayout cl = (CardLayout)panel.getLayout(); 
        cl.next(panel);
    }
}

这里首先显示 label1("Harry Joy")。然后我使 label2("Harsh Raval") 可见并尝试更改两者的位置以提供滑动效果。但是这里发生的是两个标签第一次显示在彼此之上然后开始滑动。我怎么能阻止它,我的意思是将两个标签显示在彼此之上?如果您运行一次,您可以更好地理解我的意思。

最佳答案

主要问题是您踩到了 CardLayout 的脚趾。 CardLayout 都管理组件的边界(位置和大小)和可见性,因此您的循环在这里:

    for (int i = 0; i < 10; i++) {
        try {
            Thread.sleep(500L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        label2.setLocation(label1.getX() + 10 - label1.getWidth(), label1.getY());
        label1.setLocation(label1.getX() + 10, label1.getY());
        label2.setVisible(true);
    }

与 CardLayout 的作用相冲突。默认情况下,CardLayout 将自动显示您添加的第一个组件并隐藏所有其他组件。它还将所有组件的边界设置为相同的边界。

在第一次迭代结束时,label2 的可见性发生变化(从 falsetrue),这最终会触发您的 CardLayout 重新执行设置的组件布局所有组件的边界都在同一边界,这就是您看到重叠的原因。 CardLayout 并不意味着多个组件同时可见。

请注意,您正在从 EDT(事件调度线程)运行所有这些,这确实是个坏主意。它可能会导致死锁和不可预测的行为(例如您在此处看到的行为)。

关于java - 在卡片布局中更改当前卡片,在 Swing 中使用滑动效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11343649/

相关文章:

java - JComponent 子类未出现

java - 在 JFrame 中调整 JPanel 的大小

java - 检查 CardLayout 中是否存在带有名称的卡片

java - Jenkins - 如何将覆盖率报告发布到 github

java - 无注入(inject)器的 Guice 注入(inject)

java - 滚动条没有出现

java - 使用 cardlayout 在面板之间切换时,JTextField 和按钮不会更新

c# - 如何阅读 Lotus Notes 邮件存档 (*.nsf)

java - Android ant 构建在 xxhdpi 文件夹上失败

java - 在同一帧中使用 2 个面板