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

使用JPanel的滑动效果

酆俊远
2023-03-14
+----------+    +------+---+    +----------+
|          |    |      |   |    |          |
| JPanel1  | => | JPane| JP| => | JPanel2  |
|          |    |      |   |    |          |
+----------+    +------+---+    +----------+
timer = new Timer(50, this);
timer.start();

static final int frames = 5;
int counter = 0;

actionPerformed(ActionEvent e) {
    if (counter >= frames) {
        timer.stop();
        counter = 0;
    } else {
        counter++;
        jPanel2.setBounds(800 - 800 * counter / frames, 0, 800, 600);
    }
}

共有1个答案

冯宏浚
2023-03-14

也许可以将计时器的间隔从50更改为一些更小的数字。

即据此:

timer = new Timer(50, this);

对此:

timer = new Timer(10, this);

见鬼,好像...

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class SlideEg extends JPanel {
   private SlideContainer slideContainer = new SlideContainer();

   public SlideEg() {
      setLayout(new BorderLayout());
      add(slideContainer, BorderLayout.CENTER);

      JLabel helloLabel = new JLabel("Hello", SwingConstants.CENTER);
      slideContainer.add(helloLabel);

      Timer myTimer = new Timer(5000, new ActionListener() {

         @Override
         public void actionPerformed(ActionEvent e) {
            JLabel goodbyeLabel = new JLabel("Goodbye", SwingConstants.CENTER);
            goodbyeLabel.setOpaque(true);
            goodbyeLabel.setBackground(Color.pink);
            slideContainer.add(goodbyeLabel);
         }
      });
      myTimer.setRepeats(false);
      myTimer.start();
   }

   private static void createAndShowGui() {
      SlideEg mainPanel = new SlideEg();

      JFrame frame = new JFrame("SlideEg");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

class SlideContainer extends JLayeredPane {
   private static final int PREF_W = 400;
   private static final int PREF_H = PREF_W;
   private static final int SLIDE_DELAY = 20;
   protected static final int DELTA_X = 2;
   Component oldComponent;

   public SlideContainer() {
      setLayout(null);
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }

   @Override
   public Component add(Component comp) {
      Component[] comps = getComponents();
      if (comps.length > 0) {
         oldComponent = comps[0];
      }
      if (oldComponent == comp) {
         return super.add(comp);
      }
      if (oldComponent != null) {
         putLayer((JComponent) oldComponent, JLayeredPane.DEFAULT_LAYER);
      }
      Component returnResult = super.add(comp);
      putLayer((JComponent) comp, JLayeredPane.DRAG_LAYER);
      comp.setSize(getPreferredSize());
      comp.setVisible(true);
      comp.setLocation(getPreferredSize().width, 0);
      slideFromRight(comp, oldComponent);
      return returnResult;
   }

   private void slideFromRight(final Component comp,
         final Component oldComponent2) {
      new Timer(SLIDE_DELAY, new ActionListener() {

         @Override
         public void actionPerformed(ActionEvent aEvt) {
            int x = comp.getX();
            if (x <= 0) {
               comp.setLocation(0, 0);
               putLayer((JComponent) comp, JLayeredPane.DEFAULT_LAYER);
               if (oldComponent2 != null) {
                  remove(oldComponent2);
               }
               ((Timer) aEvt.getSource()).stop();
            } else {
               x -= DELTA_X;
               comp.setLocation(x, 0);
            }
            repaint();
         }
      }).start();
   }
}
 类似资料:
  • 本文向大家介绍Android使用Scroller实现弹性滑动效果,包括了Android使用Scroller实现弹性滑动效果的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Android使用Scroller实现弹性滑动展示的具体代码,供大家参考,具体内容如下 scrollTo、scrollBy View内部为了实现滑动提供了这两个方法,但是使用这两个方法滑动的效果是瞬间的不够平滑,如何

  • 本文向大家介绍使用jQueryMobile实现滑动翻页效果的方法,包括了使用jQueryMobile实现滑动翻页效果的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了使用jQueryMobile实现滑动翻页效果的方法。分享给大家供大家参考。具体分析如下: 滑动手势在移动设备是很流行的,在移动设备中滑动翻页中很常见 虽然这个功能可以在jQueryMobile中实现,但是个人与之前一篇【j

  • 问题内容: 我有个问题。我想制作一个摆动形式,当单击按钮时,他将面板(及其内容)向左滑动,以便右侧的面板将其替换为平滑效果。 我试图做一会儿如何检查面板的大小,然后最小化它并显示下一个这样的样子: 我在C#中使用了此技巧,但在Application.DoEvent();中使用了此技巧。(显然,它在Java上不可用)。 无论如何,我可以制作2个或更多面板的幻灯片效果吗? 顺便说一句:对不起,我的英语

  • 本文向大家介绍Swift使用CollectionView实现广告栏滑动效果,包括了Swift使用CollectionView实现广告栏滑动效果的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Swift实现广告栏滑动效果的具体代码,供大家参考,具体内容如下 创建一个类:PlayCollectionViewController.swift 自定义CollectionView的cell 继

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

  • 模仿大众点评网的团购页面,整体布局滑动到顶端时,信息描述的view停止在顶端,其他布局仍可滑动。在demo中的表现是:白色视图往上滑动接近屏幕顶端时,将停止(表现为表层出现一个暗红色的视图)滑动,底部的视图继续往上移动。底部视图往下移动时,当滑动到一定位置时(表现为底部的白色视图和暗红色视图重合),白色视图将继续移动。 [Code4App.com]