РЕДАКТИРОВАТЬ
Я хочу создать программу, которая позволит мне случайным образом создавать панели, у меня есть реализация MVC.
Вот сценарий:
Когда я нажимаю кнопку Далее, я хочу обновить количество панелей (Это список панелей в PanelContainer), но графический интерфейс не будет. Когда я использую отладчик, он выглядит правильно. Я очищаю PanelsContainer и ValueList и заполняю их новыми, но в графическом интерфейсе старые панели остаются, а новые просто добавляются. Итак, я обнаружил, что у меня от 20 до N панелей.
Смотрите изображение
Я думаю, проблема в Test()(GameView)
старая версия была такой:
public void test(int number, List panels){
myListFigures.clear();
nbpanels = number;
myListTmp = panels;
panelsContrainer.removeAll();
panelsContrainer.revalidate();
setWork(nbpanels,myListTmp);
panelsContrainer.revalidate();
}
Мой код:
GameModel: класс, в котором создается количество панелей и их значения.
public class GameModel {
private boolean isDragging;
private int numberToAcheve;
private int numberOfCut;
private int numberOfPanels;
private int sum;
private List myListRandomValue = new ArrayList();
private List myListPanelsValue = new ArrayList();
GameModel(){
this.isDragging = false;
this.numberToAcheve = 0;
this.numberOfCut= 0;
this.numberOfPanels = 0;
this.sum = 0;
this.allWork();
}
public void allWork(){
int maximum = 6;
int minimum = 3;
Random rn = new Random();
StringBuilder sb = new StringBuilder();
int randomNumber = 0;
int range = 0;
// decoupage()
range = maximum - minimum + 1;
numberOfCut = rn.nextInt(range) + minimum;
// NumberAttribution()
for(int instance = 0; instance < numberOfCut;instance++){
if (Math.random() > 0.5) {
randomNumber = 1 + (int) (Math.random() * 9);
} else {
randomNumber = 10 + (int) (Math.random() * 90);
}
myListRandomValue.add(randomNumber);
}
// panelConcat()
for(int i=0; i < myListRandomValue.size(); i++){
sb.append(myListRandomValue.get(i));
}
for(int j=0; j< sb.length(); j++){
myListPanelsValue.add(Integer.parseInt(sb.substring(j,j+1)));
}
numberOfPanels = myListPanelsValue.size();
}
public int numberToAcheve(){
for(int i = 0; i < myListPanelsValue.size(); i++)
{
sum += myListPanelsValue.get(i);
}
return sum;
}
public int getNumberToAcheve() {
return numberToAcheve;
}
public int getSum() {
return sum;
}
public int getNumberOfPanels() {
return numberOfPanels;
}
public List getMyListPanelsValue() {
return myListPanelsValue;
}
}
GameView: класс содержит все компоненты и добавляет панели со значениями с помощью setWork() в графический интерфейс
public class GameView {
public List myListTmp = new ArrayList();
public int nbpanels = 0;
public List 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 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 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());
}
}
Подробнее здесь: https://stackoverflow.com/questions/331 ... is-clicked