我正在尝试使用幻灯片效果更改当前在卡片布局中可见的内容。但是我在幻灯片的开头看到了一个我无法调试/解决的问题。我怎样才能避免这种轻弹?
这里是重现错误的示例代码:
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 的可见性发生变化(从 false
到 true
),这最终会触发您的 CardLayout 重新执行设置的组件布局所有组件的边界都在同一边界,这就是您看到重叠的原因。 CardLayout 并不意味着多个组件同时可见。
请注意,您正在从 EDT(事件调度线程)运行所有这些,这确实是个坏主意。它可能会导致死锁和不可预测的行为(例如您在此处看到的行为)。
关于java - 在卡片布局中更改当前卡片,在 Swing 中使用滑动效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11343649/