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);
)。如果用户单击“下一步”
,则可以隐藏旧节点并显示新节点
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());
}
}