如何解决在Swing中实现后退/前进按钮
| 我有一个快速的问题。 我对Swing有了一点经验,最简单的方法是绘制一个相当大的GUI。 作为GUI的一部分,我想要前进和后退按钮。我正在尝试采用的方法是实现将当前JPanel推入堆栈并检索先前值(正向或反向(因此为2个堆栈))的方法。但是我无法正常工作。也许我正在完全以错误的方式进行操作,或者可能无法在使用它的方式中使用堆栈。无论哪种情况,它真的让我烦恼。我想可能有更简单的方法,例如卡片布局,但我认为这种方法应该可行,这真是令人讨厌。 可能值得注意的是,我正在使用JFrame \“ base class \\”并根据屏幕更改中央JPanel。导航栏作为“基类”的一部分是恒定的,但是 此“基类”的代码:public class Main_Frame extends JFrame{
static JPanel nav_bar_panel;
JButton home;
JButton back;
JButton forward;
JPanel currentPanel;
static Stack<JPanel> prevIoUsPanels;
static Stack<JPanel> forwardPanels;
public Main_Frame(){
super(\"DEMO\");
setSize(800,600);
setLayout(new BorderLayout());
setVisible(true);
add(nav_bar(),BorderLayout.norTH);
currentPanel = init_display();
add(currentPanel,BorderLayout.CENTER);
prevIoUsPanels = new Stack<JPanel>();
forwardPanels = new Stack<JPanel>();
}
private JPanel nav_bar(){
ButtonPressHandler handler = new ButtonPressHandler();
nav_bar_panel = new JPanel(new FlowLayout(FlowLayout.LEFT,10,10));
back = new JButton(\"Back\");
back.addActionListener(handler);
home = new JButton(\"Home\");
home.addActionListener(handler);
forward = new JButton(\"Forward\");
forward.addActionListener(handler);
nav_bar_panel.add(back);
nav_bar_panel.add(home);
nav_bar_panel.add(forward);
return nav_bar_panel;
}
private JPanel init_display(){
Home_Panel home_panel = new Home_Panel();
return home_panel;
}
public void change_display(JPanel myPanel){
invalidate();
remove(currentPanel);
prevIoUsPanels.push(currentPanel);
currentPanel = myPanel;
add(currentPanel);
validate();
}
public void prevIoUs_display(){
if(!prevIoUsPanels.empty()){
invalidate();
remove(currentPanel);
forwardPanels.push(currentPanel);
currentPanel = prevIoUsPanels.pop();
add(currentPanel);
validate();
}
}
public void forward_display(){
if(!forwardPanels.empty()){
invalidate();
remove(currentPanel);
prevIoUsPanels.push(currentPanel);
currentPanel = forwardPanels.pop();
add(currentPanel);
validate();
}
}
private class ButtonPressHandler implements ActionListener
{
public void actionPerformed( ActionEvent event )
{
if(event.getSource() == back){
prevIoUs_display();
System.out.print(\"You selected back\");
} else if(event.getSource() == forward){
forward_display();
System.out.print(\"You selected forward\");
}
} // end method actionPerformed
} // end private inner class TextFieldHandler
}
解决方法
这是使用ѭ1的示例。
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.util.Random;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
/** @see http://stackoverflow.com/questions/5654926 */
public class CardPanel extends JPanel {
private static final Random random = new Random();
private static final JPanel cards = new JPanel(new CardLayout());
private final String name;
public CardPanel(String name) {
this.name = name;
this.setPreferredSize(new Dimension(320,240));
this.setBackground(new Color(random.nextInt()));
this.add(new JLabel(name));
}
@Override
public String toString() {
return name;
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
create();
}
});
}
private static void create() {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
for (int i = 1; i < 9; i++) {
CardPanel p = new CardPanel(\"Panel \" + String.valueOf(i));
cards.add(p,p.toString());
}
JPanel control = new JPanel();
control.add(new JButton(new AbstractAction(\"\\u22b2Prev\") {
@Override
public void actionPerformed(ActionEvent e) {
CardLayout cl = (CardLayout) cards.getLayout();
cl.previous(cards);
}
}));
control.add(new JButton(new AbstractAction(\"Next\\u22b3\") {
@Override
public void actionPerformed(ActionEvent e) {
CardLayout cl = (CardLayout) cards.getLayout();
cl.next(cards);
}
}));
f.add(cards,BorderLayout.CENTER);
f.add(control,BorderLayout.SOUTH);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
, 使我可以重用的想法很不错。可惜秋千没有内置此功能
查看Card Layout Actions(卡布局操作),这些操作可能会尝试使Card Layout变得更易于使用。
,我通常的做法如下:
我有一个StepManager类(编写一次,永久使用),该类处理与步骤相关的所有逻辑。它具有next(),previous(),reset(),isFirst()和isLast()之类的方法。
然后,我会得到带有适当操作(或您选择用于侦听用户交互的任何内容)的“下一步”和“上一步”按钮。
与\'Next \'按钮相关的代码调用stepManager.next()来检索下一步的索引。然后(当我完成下一步时)我只需调用(另一种方法)showStep(int index)以显示与当前步骤索引相对应的实际步骤用户界面。
每个步骤都是一个单独的JPanel(Step01,Step02,Step03 ...)。
public void showStep(int index) {
ContentPanel.removeAll();
ContentPanel.setLayout(new BorderLayout());
switch (index) {
case 0:
ContentPanel.add(Step01,BorderLayout.CENTER);
break;
case 1:
ContentPanel.add(Step02,BorderLayout.CENTER);
break;
case 2:
ContentPanel.add(Step03,BorderLayout.CENTER);
break;
case 3:
ContentPanel.add(Step04,BorderLayout.CENTER);
}
ContentPanel.validate();
ContentPanel.repaint();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。