Java 单击按钮时如何动态更改JPanel?

Java 单击按钮时如何动态更改JPanel?,java,swing,Java,Swing,编辑 我想做一个程序,它允许我随机创建面板,我有一个MVC实现 这里是场景: 单击“下一步”按钮时,我想更新面板的数量(它是面板容器中的面板列表),但GUI不会更新。当我使用调试器时,它看起来是正确的。我清空panelsContainerand和valuesList,并用新的填充,但在GUI中,旧面板保留,新面板刚刚添加。所以我发现我自己有20到N个面板 我认为问题在于Test()(GameView) 旧的是这样的: public void test(int number, List<I

编辑

我想做一个程序,它允许我随机创建
面板
,我有一个
MVC
实现

这里是场景:

单击“下一步”按钮时,我想更新面板的数量(它是
面板容器中的面板列表),但GUI不会更新。当我使用调试器时,它看起来是正确的。我清空panelsContainerand和valuesList,并用新的填充,但在GUI中,旧面板保留,新面板刚刚添加。所以我发现我自己有20到N个面板

我认为问题在于
Test()
(GameView)

旧的是这样的:

public void test(int number, List<Integer> panels){
    myListFigures.clear();
    nbpanels = number;
    myListTmp = panels;     

    panelsContrainer.removeAll();
    panelsContrainer.revalidate();
    setWork(nbpanels,myListTmp);
    panelsContrainer.revalidate();
}
游戏控制器:

public class GameController {

private GameModel model;
private GameView view;


public GameController(GameModel model, GameView view) {
    this.model = model;
    this.view = view;        
      this.view.setWork(this.model.getNumberOfPanels(),this.model.getMyListPanelsValue());

}

public void contol(){        
    view.getNext().addActionListener(new ActionListener() {
       public void actionPerformed(ActionEvent e) {
            action();
       }
    });

}

private void action(){
model.allWork();                
    view.test(model.getNumberOfPanels(),model.getMyListPanelsValue());
}     

}

有许多不同的可能性(并且使用不同的框架),让我们讨论其中两种:

  • 你把一切都扔到舞台上。您不希望用户看到的内容可以设置为不可见(通常:
    node.setVisible(false);
    )。如果用户单击“下一步”
  • ,则可以隐藏旧节点并显示新节点
  • 您可以使用准备好的面板,只需将它们换掉即可。示例(JavaFX):
  • root.setCenter(新的第一页())

    如果用户单击“下一步”按钮:

    root.setCenter(新的第二页()):


    其中
    root
    是一个
    BorderPane
    (以及您的root视图),
    FirstPage
    SecondPage
    是扩展
    节点或
    窗格的类,包含您的UI元素。

    “单击按钮时动态更改面板”如中所示“使用”。有人能给我举个例子吗?”因此,它不是代码生成机器。“我尝试了很多代码和建议,但没有结果。”如果您展示您尝试过的内容,并描述它不起作用的原因,这会有所帮助。尝试调用
    revalidate()
    ,然后在添加/删除组件后在主
    JFrame
    上重新绘制()
    。面板管理员正在刷新,但就像我上面提到的一样。在GUI中不会删除旧面板。因此,新的是刚刚添加。我不知道为什么?为了更快地得到更好的帮助,发布一个or。
    public class GameView {
    
    public List<Integer> myListTmp = new ArrayList<>(); 
    public int nbpanels = 0;
    
    public  List<Figure> myListFigures = new ArrayList<>(); 
    private JPanel panelsContrainer = new JPanel(new GridLayout(1,0));
    private JPanel controlsContrainer = new JPanel();
    
    private final JFrame frame;
    private JButton next   = new JButton("Next");        
    
    
    public GameView(){                  
    
        frame = new JFrame("");
        frame.getContentPane().setLayout(new BorderLayout()); 
    
        controlsContrainer.add(next);        
    
    
        frame.getContentPane().add(panelsContrainer, BorderLayout.NORTH);
        frame.getContentPane().add(controlsContrainer, BorderLayout.CENTER);  
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);           
        frame.setSize(800,300);
        frame.setVisible(true);   
    }
    
    public JButton getNext() {
        return next;
    }
    public void setWork(int numberOfPanels, List<Integer> panelsValues){
        for(int instance = 0; instance < numberOfPanels; instance++){
            myListFigures.add(new Figure(panelsValues.get(instance)));
            panelsContrainer.add(myListFigures.get(instance));    
        }
    }
    
    public void test(int number, List<Integer> panels){
        myListFigures.clear();
        nbpanels = number;
        myListTmp = panels;     
    
    } 
    
    }
    
    public class GameController {
    
    private GameModel model;
    private GameView view;
    
    
    public GameController(GameModel model, GameView view) {
        this.model = model;
        this.view = view;        
          this.view.setWork(this.model.getNumberOfPanels(),this.model.getMyListPanelsValue());
    
    }
    
    public void contol(){        
        view.getNext().addActionListener(new ActionListener() {
           public void actionPerformed(ActionEvent e) {
                action();
           }
        });
    
    }
    
    private void action(){
    model.allWork();                
        view.test(model.getNumberOfPanels(),model.getMyListPanelsValue());
    }     
    
    }