gpt4 book ai didi

java - 在 Swing 中实现后退/前进按钮

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:06:57 26 4
gpt4 key购买 nike

我有一个简短的问题。

我对 Swing 有了一点经验,最简单的方法是绘制一个相当大的 GUI。

作为 GUI 的一部分,我想要前进和后退按钮。我尝试采用的方法是实现将当前 JPanel 推送到堆栈并检索先前值(向前或反向(因此 2 个堆栈))的方法。我无法让它工作。也许我正在以完全错误的方式处理它,或者堆栈不能按照我使用它的方式使用。无论哪种情况,这都让我很烦恼。我想可能有更简单的方法,比如卡片布局,但我认为这种方法应该有效,这就是令人讨厌的地方。

可能值得注意的是,我正在使用 JFrame“基类”并根据屏幕更改中央 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

}

最佳答案

这是一个使用 CardLayout 的例子.

enter image description here

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);
}
}

关于java - 在 Swing 中实现后退/前进按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5654926/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com