У меня быстрый вопрос.
У меня небольшой опыт работы с Swing, и самый простой способ сделать это - разработать достаточно большой графический интерфейс.
Как часть 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
}