使用JPanel进行幻灯片效果 [英] slide effect with JPanel
本文介绍了使用JPanel进行幻灯片效果的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我尝试创建一个简单的类,可以像这样滑动JPanel:
I tried create simple class which can slide a JPanel like this:
+----------+ +------+---+ +----------+
| | | | | | |
| JPanel1 | => | JPane| JP| => | JPanel2 |
| | | | | | |
+----------+ +------+---+ +----------+
我创建了javax.swing.Timer并在类中添加了
I created javax.swing.Timer and added in class
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);
}
}
这是工作,但速度很慢。我只有2-3 fps,不知道如何加快这种方法。你可以帮助我吗?
This is work, but very slowly. I have only 2-3 fps and don't know how to speed up this method. May you help me?
推荐答案
或许可以将Timer的间隔从50更改为更小的数字。
Perhaps change the Timer's interval from 50 to some smaller number.
即,来自:
timer = new Timer(50, this);
到此:
timer = new Timer(10, this);
注意:你应该避免在这里使用幻数。
Note: you should avoid use of magic numbers here.
哎呀,类似......
Heck, something like...
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();
}
}
这篇关于使用JPanel进行幻灯片效果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文