Hallo liebe Leute
Problem in folgender Klasse:
Die Klasse dient dazu, Daten anzuzeigen, soweit, so gut. Wenn ich mein Programm starte und keine Daten vorhanden sind, dann soll die Tabelle eine Zelle mit einer entsprechenden Nachricht anzeigen (siehe refreshActiveLibStampPage-Methode). Das Anzeigen an sich funktioniert soweit.
Jetzt habe ich ein Event, wenn der Benutzer eine Zelle anklickt (onChanged-Methode). Die wird auch korrekt getriggert.
Jetzt kommt das Problem: Wenn ich die Zelle mit der Keine-Daten-Nachricht anklicke, erhalte ich eine IndexOutOfBoundsException. Ich habe den starken Verdacht daß es damit zusammenhängt, daß die SpreadsheetView ein Problem mit den Spalten hat, den tp.column() liefert -1 (siehe onChanged-Methode). Ich sehe aber nicht, welches Problem. Spaltenheader ist da und wird korrekt angezeigt, sowohl SpreadsheetView.getColumns.size() als auch das Grid.getColumnCount() liefern wie erwartet 1. Siehe Screenshot.
Hat jemand eine Idee, woran das liegen kann?
Problem in folgender Klasse:
Java:
public class CenterviewStamptable extends SpreadsheetView
implements
ModelObservable,
ListChangeListener<Object>{
private View view;
private MultiLangSupport lang;
private ViewSettings settings;
private StamppageModel activeStamppage;
private ModelsViewLinkable model;
private ArrayList<StamptableObservable> selectionobserver;
private Grid centerviewStampgrid;
public CenterviewStamptable(View view, ModelsViewLinkable model) {
selectionobserver = new ArrayList<>();
this.view = view;
this.model = model;
lang = new MultiLangSupport();
settings = ViewSettings.getInstance();
model.addModelobserver(this, ModelChange.THE_STAMPPAGE_AT_ACTIVE_PAGE_HAS_CHANGED);
activeStamppage = model.getStamppageModel(model.getAddressOfActiveLibrarypage());
init();
//this.addEventHandler(EventType.ROOT, this);
// eventhandler = new EventHandler<ActionEvent>() {
// @Override
// public void handle(ActionEvent event) {
// throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
// }
// };
this.getSelectionModel().getSelectedCells().addListener(this);
}
private void init(){
setShowColumnHeader(true);
setShowRowHeader(false);
//refreshActiveLibStampPage();
refreshActiveLibStampPage();
}
private void refreshActiveLibStampPage() {
int rowcnt;
int colcnt;
int spanwidht;
int spanstart;
ObservableList<ObservableList<SpreadsheetCell>> rows;
//Build grid
rowcnt = activeStamppage.hasNoStampsets() ? 1 : 2 * activeStamppage.cntStampsets();
colcnt = activeStamppage.hasNoProperties()? 1 : activeStamppage.cntAllProperties();
centerviewStampgrid = new GridBase(rowcnt, colcnt);
//Build rows
if(activeStamppage.hasNoStampsets()){
if (activeStamppage.hasNoProperties()) { //Im ersten Durchgang wird hier korrekt reingesprungen
buildEmptyCenterviewStamptableheader();
rows = getRowWithEmptyMSG();
}
else {
buildCenterviewStamptableheader();
rows = getRowWithEmptyMSGAndCellspan();
}
}
else{
if (activeStamppage.hasNoProperties()) {
buildEmptyCenterviewStamptableheader();
rows = getRowsWithStampsetNamesAndEmptyMSG();
}
else {
buildCenterviewStamptableheader();
rows = getRowsWithStampsetNamesAndDescriptions();
}
}
this.setGrid(centerviewStampgrid);
centerviewStampgrid.setRows(rows);
//Build table header
buildCenterviewStamptableheader();
//Fit Columns
for(SpreadsheetColumn column : this.getColumns()){
column.fitColumn();
}
//span name cells
if(activeStamppage.hasNoStampsets()){
spanstart = 0;
spanwidht = activeStamppage.cntAllProperties();
centerviewStampgrid.spanColumn(spanwidht, 0, spanstart);
}
else{
spanwidht = activeStamppage.cntPersistantProperties();
spanstart = activeStamppage.cntTemporaryProperties();
for (int row = 0; row < rowcnt; row += 2) {
centerviewStampgrid.spanColumn(spanwidht, row, spanstart);
}
}
}
private void buildEmptyCenterviewStamptableheader() {
centerviewStampgrid.getColumnHeaders().add(lang.getString(3080));
}
private void buildCenterviewStamptableheader() {
// for (StamppageheaderModel stamppageHeader : activeStamppage.getColumnheaderModels()) {
// if(stamppageHeader.kindOfProperty == KindOfProperty.TEMPORARY){
// centerviewStampgrid.getColumnHeaders().add(stamppageHeader.propertyName);
// }
// }
// for (StamppageheaderModel stamppageHeader : activeStamppage.getColumnheaderModels()) {
// if(stamppageHeader.kindOfProperty == KindOfProperty.PERSISTANT){
// centerviewStampgrid.getColumnHeaders().add(stamppageHeader.propertyName);
// }
// }
for(StamppageheaderModel stamppageHeader : activeStamppage.getColumnheaderModels()){
centerviewStampgrid.getColumnHeaders().add(stamppageHeader.propertyName);
}
}
private ObservableList<ObservableList<SpreadsheetCell>> getRowWithEmptyMSG() {
ObservableList<ObservableList<SpreadsheetCell>> rows = FXCollections.observableArrayList();
ObservableList<SpreadsheetCell> row = FXCollections.observableArrayList();
SpreadsheetCell cell = SpreadsheetCellType.STRING.createCell(
1, 1, 1, 1, lang.getString(3081));
row.add(cell);
rows.add(row);
return rows;
}
private ObservableList<ObservableList<SpreadsheetCell>> getRowWithEmptyMSGAndCellspan() {
ObservableList<ObservableList<SpreadsheetCell>> rows = FXCollections.observableArrayList();
ObservableList<SpreadsheetCell> row = FXCollections.observableArrayList();
SpreadsheetCell cell;
for(int colcnt = 0; colcnt < activeStamppage.cntAllProperties(); colcnt++){
cell = SpreadsheetCellType.STRING.createCell(
0, colcnt, 1, 1, lang.getString(3081));
row.add(cell);
}
rows.add(row);
return rows;
}
private ObservableList<ObservableList<SpreadsheetCell>> getRowsWithStampsetNamesAndEmptyMSG() {
ObservableList<ObservableList<SpreadsheetCell>> rows = FXCollections.observableArrayList();
ObservableList<SpreadsheetCell> row;
for(int stampsetCnt = 0; stampsetCnt < activeStamppage.cntStampsets(); stampsetCnt++){
StampsetModel stampset = activeStamppage.getRowModel(stampsetCnt);
String stampsetName = stampset.getName();
row = getRowWithStampSetName(stampsetName, stampsetCnt);
rows.add(row);
row = getRowWithEmptyDescriptionMSG(2 * stampsetCnt + 1);
rows.add(row);
}
return rows;
}
private ObservableList<ObservableList<SpreadsheetCell>> getRowsWithStampsetNamesAndDescriptions() {
ObservableList<ObservableList<SpreadsheetCell>> rows = FXCollections.observableArrayList();
ObservableList<SpreadsheetCell> row;
for(int stampsetCnt = 0; stampsetCnt < activeStamppage.cntStampsets(); stampsetCnt++){
StampsetModel stampset = activeStamppage.getRowModel(stampsetCnt);
String stampsetName = stampset.getName();
row = getRowWithStampSetName(stampsetName, stampsetCnt);
rows.add(row);
row = getRowWithStampDescriptions(stampset.getItemmodels(),2 * stampsetCnt + 1);
rows.add(row);
}
return rows;
}
private ObservableList<SpreadsheetCell> getRowWithEmptyDescriptionMSG(int rowcnt) {
ObservableList<SpreadsheetCell> row = FXCollections.observableArrayList();
SpreadsheetCell cell;
cell = SpreadsheetCellType.STRING.createCell(rowcnt, 0, 1, 1, lang.getString(3082));
row.add(cell);
return row;
}
private ObservableList<SpreadsheetCell> getRowWithStampSetName(String name, int rowcnt) {
ObservableList<SpreadsheetCell> row;
SpreadsheetCell cell;
int columncnt;
row = FXCollections.observableArrayList();
if(activeStamppage.hasNoProperties()){
cell = SpreadsheetCellType.STRING.createCell(rowcnt, 0, 1, 1, name);
row.add(cell);
}
else{
columncnt = 0;
for(String s : activeStamppage.getTemporaryProperties()){
cell = SpreadsheetCellType.STRING.createCell(rowcnt, columncnt, 1, 1, "");
row.add(cell);
columncnt++;
}
for(String s : activeStamppage.getPersistantProperties()){
cell = SpreadsheetCellType.STRING.createCell(rowcnt, columncnt, 1, 1, name);
row.add(cell);
columncnt++;
}
}
return row;
}
private ObservableList<SpreadsheetCell> getRowWithStampDescriptions(ArrayList<ComponentstampModel> itemmodels, int rowcnt) {
ObservableList<SpreadsheetCell> row;
SpreadsheetCell cell;
int columnindex;
String cellcontent;
row = FXCollections.observableArrayList();
columnindex = 0;
for(ComponentstampModel component : itemmodels){
if(component == null){
cellcontent = lang.getString(3082);
}
else{
cellcontent = component.getDescription();
}
cell = SpreadsheetCellType.STRING.createCell(rowcnt, columnindex, 1, 1, cellcontent);
row.add(cell);
columnindex++;
}
return row;
}
/**
* New StamptableObservers register here.
*
* @param observer
*/
void addStamptableSelectionObserver(StamptableObservable observer){
if(!selectionobserver.contains(observer)){
selectionobserver.add(observer);
}
}
/**
* StamptableObserver can remove thereself from notify list here.
*
* @param observer
*/
void removeStamptableSelectionObserver(StamptableObservable observer){
selectionobserver.remove(observer);
}
@Override
public void notifyAboutChanges(ModelChange change) {
if(change == ModelChange.THE_STAMPPAGE_AT_ACTIVE_PAGE_HAS_CHANGED){
activeStamppage = model.getStamppageModel(model.getAddressOfActiveLibrarypage());
refreshActiveLibStampPage();
}
}
@Override
public void onChanged(Change<? extends Object> c) {
TablePosition tp;
int row;
int column;
Identifier selectedStampset;
Identifier selectedProperty;
tp = getSelectionModel().getSelectedCells().get(0);
System.out.println("Zeile: " + tp.getRow() + " - Spalte: " + tp.getColumn());
row = tp.getRow()/2;
column = tp.getColumn();
if(activeStamppage.hasNoStampsets()){
selectedStampset = null;
}
else{
selectedStampset = activeStamppage.getItem(row, column).getRow();
}
if(activeStamppage.hasNoProperties()){
selectedProperty = null;
}
else{
selectedProperty = activeStamppage.getItem(row, column).getColumn();
}
for(StamptableObservable observer : selectionobserver){
observer.setNewSelection(selectedStampset, selectedProperty);
}
}
}
Die Klasse dient dazu, Daten anzuzeigen, soweit, so gut. Wenn ich mein Programm starte und keine Daten vorhanden sind, dann soll die Tabelle eine Zelle mit einer entsprechenden Nachricht anzeigen (siehe refreshActiveLibStampPage-Methode). Das Anzeigen an sich funktioniert soweit.
Jetzt habe ich ein Event, wenn der Benutzer eine Zelle anklickt (onChanged-Methode). Die wird auch korrekt getriggert.
Jetzt kommt das Problem: Wenn ich die Zelle mit der Keine-Daten-Nachricht anklicke, erhalte ich eine IndexOutOfBoundsException. Ich habe den starken Verdacht daß es damit zusammenhängt, daß die SpreadsheetView ein Problem mit den Spalten hat, den tp.column() liefert -1 (siehe onChanged-Methode). Ich sehe aber nicht, welches Problem. Spaltenheader ist da und wird korrekt angezeigt, sowohl SpreadsheetView.getColumns.size() als auch das Grid.getColumnCount() liefern wie erwartet 1. Siehe Screenshot.
Hat jemand eine Idee, woran das liegen kann?