当前位置: 首页 > 知识库问答 >
问题:

在swing中使用滑动效果改变卡片布局中的当前卡片

仲孙兴旺
2023-03-14

我正在尝试改变当前可见的卡片布局与幻灯片效果。但我在幻灯片的开始看到一个我无法调试/解决的闪烁。我怎么才能避开那部电影呢?

下面是再现错误的示例代码:

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”)可见,并尝试更改两者的位置以提供幻灯片效果。但这里发生的是第一次两个标签显示在彼此的顶部,然后它开始滑动。我的意思是把两个标签都显示在对方的上面,我怎么才能停止呢?如果你运行一次,你就能更好地理解我的意思。

共有1个答案

胡浩瀚
2023-03-14

主要的问题是你踩到了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(事件调度线程)运行的,这真的是一个坏主意。它会导致死锁和不可预测的行为(比如您在这里看到的)。

 类似资料:
  • 本文向大家介绍Android实现横向滑动卡片效果,包括了Android实现横向滑动卡片效果的使用技巧和注意事项,需要的朋友参考一下 最近项目上需要实现这样效果的一个页面,本来想找个现成的两下搞定,但是问了半天度娘也没招,索性自己琢磨琢磨(这里边也少不了同事的帮助),先把最终的效果图贴上: 理论上讲,其本质并不复杂,就是一个viewpager,但是第一次实现这样的效果还是要花些时间的,具体的代码如下

  • 我是刚到爪哇的。我想把我的cardlayout添加到JFrame中。我之所以要这样做,是因为我可以通过关闭jframe在单击exit按钮时退出框架(窗口)。下面的程序是对JFrame的扩展。但我想声明JFrame,并在上面添加卡片。我试过了,但没有成功。我还想把card1的Jpanel设置为500(宽),500(高),但全屏显示。

  • 自定义选项卡选择效果,包括:点击tab产生高光效果,tab下面的横条滑动到选择的tab,对应的视图也进行滑动显示。 [Code4App.com]

  • 我试图得到一个布局就像下面的图像为一个游戏在android studio 当前我的xml是 我想在下一个级别增加更多的卡(如lvl 2)我需要为每个级别做几个布局吗?

  • 我使用的是卡片布局,有两个面板与之关联。一个面板有一个J文本字段。我希望在执行以下步骤后,之前输入到Jpanel中的值消失: 在JextField中输入某物 转到另一个面板 然后回到第一个面板 此外,当我在文本面板上时,我不希望文本在我失去对文本字段的焦点时消失。我如何才能完成这种行为? 下面是一个简单的程序来显示我的问题。

  • 如何删除用户所在的当前卡。我知道如何使用next和previous函数通过一个卡片布局,但是如何删除用户正在使用的当前帧呢?例如,如果我有一个程序,其中我目前在第3个面板中的5个面板,我将如何删除当前的一个,这是第3个面板。一旦您移除它,下一个或上一个将替换它。我不认为可以使用removecurrentlayout,因为我没有删除组件。例如,在代码中,如果我在卡3上,我将如何删除卡3。