У меня есть двумерный символьный массив с переменным размером, который я хочу отобразить в двумерной сетке. Я сделал это с помощью вложенного c: forEach. Начальный дисплей в порядке. Дисплей стал ошибочным после добавления нового элемента в любой из массивов и обновления дисплея. Я использую сервер Glassfish 4.1.2 с java 8 и PrimeFace 7.0.
Я попытался заменить его на ui: repeat. Однако, поскольку я намерен реализовать манипуляцию с помощью перетаскивания по дороге, идентификаторы должны быть известны, а не генерироваться, как в случае с ui: repeat. Я попытался добавить process = "@ parent" в commandButton, это неэффективно. Я также изменил с # на $, также без разницы.
@Named
@SessionScoped
public class TestMB implements Serializable {
private static final long serialVersionUID = 1L;
private ArrayList<ArrayList<Character>> testData = new ArrayList<ArrayList<Character>>();
public TestMB() {
}
@PostConstruct
private void init() {
ArrayList<Character> i1 = new ArrayList<Character>();
i1.add('a');
i1.add('b');
i1.add('c');
ArrayList<Character> i2 = new ArrayList<Character>();
i2.add('d');
i2.add('e');
ArrayList<Character> i3 = new ArrayList<Character>();
i3.add('f');
i3.add('g');
i3.add('h');
i3.add('j');
this.testData.add(i1);
this.testData.add(i2);
this.testData.add(i3);
}
public ArrayList<ArrayList<Character>> getData() {
return this.testData;
}
public void insert() {
this.testData.get(0).add(2, 'i');
}
}
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:pf="http://primefaces.org/ui"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:p="http://xmlns.jcp.org/jsf/passthrough">
<pf:panelGrid id="testGrid">
<c:forEach var="row" items="#{testMB.getData}">
<pf:row>
<c:forEach var="letter" items="#{row}">
<pf:column>
<pf:outputLabel value="#{letter}" style="display: inline" />
</pf:column>
</c:forEach>
</pf:row>
</c:forEach>
</pf:panelGrid>
<pf:commandButton value="test" actionListener="#{testMB.insert()}" update="topForm:testGrid" />
</ui:composition>
Начальное отображение:
abc
de
fghj
, что является правильнымотобразить. После нажатия кнопки проверки и активации вставки (). На дисплее появится:
abic
ee
hjj
Что является ошибочным. Однако, если я уйду со страницы и вернусь, дисплей изменится на:
abic
de
fghj
, что является правильным отображением. Я подозреваю, что это происходит потому, что при начальной загрузке и обратной передаче информация обрабатывается по-разному, но я не уверен, как исправить эту проблему, чтобы при обратной передаче корректно отображался дисплей.