Мой макет программного обеспечения - это своего рода волшебная база. Таким образом, базовая панель разделена на два JPanel
. Одна левая панель, которая никогда не изменяется. И одна правая панель, которая работает с CardLayout
. Он имеет множество подпанелей и показывает каждый из них методом.
Я могу легко перейти от одной внутренней панели к другой. Но я хочу иметь кнопку в левой панели и менять панели с правой стороны.
Вот пример кода, который вы можете запустить:
БАЗА:
public class Base {
JFrame frame = new JFrame("Panel");
BorderLayout bl = new BorderLayout();
public Base(){
frame.setLayout(bl);
frame.setSize(800, 600);
frame.add(new LeftBar(), BorderLayout.WEST);
frame.add(new MainPanel(), BorderLayout.CENTER);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws IOException {
// TODO code application logic here
new Base();
}
}
Левая сторона
public class LeftBar extends JPanel{
JButton button;
MainPanel mainPanel = new MainPanel();
public LeftBar(){
setPreferredSize(new Dimension(200, 40));
setLayout(new BorderLayout());
setBackground(Color.black);
button = new JButton("Show Second Page");
button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent ae) {
mainPanel.showPanel("secondPage");
}
});
add(button, BorderLayout.NORTH);
}
}
Правая сторона
public class MainPanel extends JPanel {
private CardLayout cl = new CardLayout();
private JPanel panelHolder = new JPanel(cl);
public MainPanel(){
FirstPage firstPage = new FirstPage(this);
SecondPage secondPage = new SecondPage(this);
setLayout(new GridLayout(0,1));
panelHolder.add(firstPage, "firstPage");
panelHolder.add(secondPage, "secondPage");
cl.show(panelHolder, "firstPage");
add(panelHolder);
}
public void showPanel(String panelIdentifier){
cl.show(panelHolder, panelIdentifier);
}
}
Внутренние панели для правой стороны:
public class FirstPage extends JPanel {
MainPanel mainPanel;
JButton button;
public FirstPage(MainPanel mainPanel) {
this.mainPanel = mainPanel;
setBackground(Color.GRAY);
button = new JButton("Show page");
button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent ae) {
mainPanel.showPanel("secondPage");
}
});
add(button);
}
}
public class SecondPage extends JPanel{
MainPanel mainPanel;
JButton button;
public SecondPage(MainPanel mainPanel){
this.mainPanel = mainPanel;
setBackground(Color.white);
add(new JLabel("This is second page"));
}
}
И это картина, чтобы дать вам идею:
Как я объяснил, я могу перейти с первой страницы на "вторую страницу" с помощью этого метода: mainPanel.showPanel("secondPage");
или mainPanel.showPanel("firstPage");
,
Но у меня также есть JButton
в левой панели, который я называю тем же методом, чтобы показать вторую панель CardLayout. Но это не работает. Однако он не дает никакой ошибки.
Любая идея, как изменить эти панели CardLayout
за пределами панелей?
Проблема в том, что у LeftBar
есть mainPanel
который инициализируется новым экземпляром MainPanel
. Таким образом, у вас есть два экземпляра MainPanel
, один из которых выделен в Base
и добавлен в кадр, а другой - в LeftBar
.
Таким образом, LeftBar
выполняет mainPanel.showPanel("secondPage");
на втором экземпляре MainPanel
который даже не является частью визуальной иерархии. Чтобы исправить это, просто передайте существующий экземпляр MainPanel
конструктору LeftBar
. Вы уже делаете это в FirstPage
и SecondPage
.