Java 在Swing中实现后退/前进按钮
我有一个简短的问题 我对Swing有一点经验,最简单的方法是绘制一个相当大的GUI 作为GUI的一部分,我希望有前进和后退按钮。我尝试采用的方法是实现将当前JPanel推送到堆栈并检索以前的值(向前或反向(因此有两个堆栈))的方法。但是我不能让它工作。也许我完全用错了方法,或者堆栈不能用在我使用它的方式中。不管是哪种情况,我都很烦。我想可能有更简单的方法,比如卡片布局,但我认为这种方法应该有效,这就是为什么这么烦人 值得注意的是,我正在使用JFrame“基类”,并根据屏幕的不同更改中心JPanel。然而,导航条作为“基类”的一部分是恒定的 此“基类”的代码:Java 在Swing中实现后退/前进按钮,java,swing,stack,Java,Swing,Stack,我有一个简短的问题 我对Swing有一点经验,最简单的方法是绘制一个相当大的GUI 作为GUI的一部分,我希望有前进和后退按钮。我尝试采用的方法是实现将当前JPanel推送到堆栈并检索以前的值(向前或反向(因此有两个堆栈))的方法。但是我不能让它工作。也许我完全用错了方法,或者堆栈不能用在我使用它的方式中。不管是哪种情况,我都很烦。我想可能有更简单的方法,比如卡片布局,但我认为这种方法应该有效,这就是为什么这么烦人 值得注意的是,我正在使用JFrame“基类”,并根据屏幕的不同更改中心JPane
public类主框架扩展了JFrame{
静态JPanel导航条面板;
杰布顿之家;
钮扣背;
按钮向前;
JPanel currentPanel;
静态堆叠面板;
静态堆叠面板;
公共主框架(){
超级(“演示”);
设置大小(800600);
setLayout(新的BorderLayout());
setVisible(真);
添加(导航栏(),BorderLayout.NORTH);
currentPanel=init_display();
添加(currentPanel,BorderLayout.CENTER);
previousPanels=新堆栈();
forwardPanels=新堆栈();
}
私人JPanel导航栏(){
ButtonPressHandler=新建ButtonPressHandler();
导航栏面板=新的JPanel(新的FlowLayout(FlowLayout.LEFT,10,10));
后退=新的按钮(“后退”);
addActionListener(处理程序);
主页=新的JButton(“主页”);
addActionListener(处理程序);
前进=新的按钮(“前进”);
addActionListener(处理程序);
导航栏面板。添加(背面);
导航栏面板。添加(主页);
导航栏面板。添加(前进);
返回导航条面板;
}
私有JPanel init_display(){
主面板主面板=新主面板();
返回主页面板;
}
公共作废更改显示(JPanel myPanel){
使无效();
移除(当前面板);
前面板。推送(当前面板);
currentPanel=myPanel;
添加(当前面板);
验证();
}
公共作废上一次_显示(){
如果(!previousPanels.empty()){
使无效();
移除(当前面板);
向前面板。推动(当前面板);
currentPanel=previousPanels.pop();
添加(当前面板);
验证();
}
}
公共无效前向显示(){
如果(!forwardPanels.empty()){
使无效();
移除(当前面板);
前面板。推送(当前面板);
currentPanel=forwardPanels.pop();
添加(当前面板);
验证();
}
}
私有类ButtonPressHandler实现ActionListener
{
已执行的公共无效操作(操作事件)
{
if(event.getSource()=返回){
上一个_显示();
系统输出打印(“您选择了返回”);
}else if(event.getSource()==forward){
正向显示();
系统输出打印(“您选择了转发”);
}
}//已执行结束方法操作
}//结束私有内部类TextFieldHandler
}
我通常的做法如下:
导入java.awt.BorderLayout;
导入java.awt.CardLayout;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.event.ActionEvent;
导入java.util.Random;
导入javax.swing.AbstractAction;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
/**@见http://stackoverflow.com/questions/5654926 */
公共类CardPanel扩展了JPanel{
私有静态最终随机=新随机();
私有静态最终JPanel卡=新JPanel(新CardLayout());
私有最终字符串名;
公共CardPanel(字符串名称){
this.name=名称;
此.setPreferredSize(新维度(320240));
这个.setBackground(新颜色(random.nextInt());
添加(新JLabel(名称));
}
@凌驾
公共字符串toString(){
返回名称;
}
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
创建();
}
});
}
私有静态void create(){
JFrame f=新的JFrame();
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
对于(int i=1;i<9;i++){
CardPanel p=新的CardPanel(“面板”+字符串.valueOf(i));
添加(p,p.toString());
}
JPanel控件=新的JPanel();
添加(新的JButton(新的抽象操作(“\u22b2Prev”){
@凌驾
已执行的公共无效操作(操作事件e){
卡德拉尤
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
}
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();
}
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);
}
}