JavaFX Table mit MenuButton

ZebaX

Mitglied
Hallo,

gibt es die Möglichkeit, wenn ich ein Objekt auf eine Zelle legen auch ein anderes Value anzeigen zu lassen in dieser Zelle?

dazu mal bischen Code:


Java:
	private Callback<TableColumn, TableCell> cellFactory;
	private ObservableList<TableColumn<PortAdmin, ?>> columnList;
	
	private Settings_Port() {
		cellFactory = new Callback<TableColumn, TableCell>() {
			@Override
			public TableCell call(TableColumn param) {
				return new EditingCell();
			}
			
		};
	}

        public void setList(ObservableList<TableColumn<PortAdmin,?>> list){
		this.columnList = list;
		setCellValueFactory();
	}
        
        private void setCellValueFactory() {
                TableColumn tc = this.columnList.get(0);
		tc.setCellValueFactory(new PropertyValueFactory<PortAdmin, Ports>("port"));
		tc.setCellFactory(cellFactory);
        }

Java:
class EditingCell<T> extends TableCell<PortAdmin, Object>{
		private TextField textField;
		private ToggleButton toggleButton;
		private ChoiceBox<Boolean> choiceBox;
		private MenuButton choice;
			
		public EditingCell(){
		}
		
		@Override
        public void startEdit() {
            if (!isEmpty()) {
                super.startEdit();
                createSelector();
            }
        }
 
        @Override
        public void cancelEdit() {
            super.cancelEdit();
 
            setText(String.valueOf(getItem()));
            setGraphic(null);
        }
 
        @Override
        public void updateItem(Object item, boolean empty) {
            super.updateItem(item, empty);
           
            if (empty) {
                setText(null);
                setGraphic(null);
            } else {            
                if (isEditing()) {
                    if (textField != null) {
                        textField.setText(getString());
                    }
                    setText("");
                    setGraphic(textField);
                } else {
                    setText(getString());
                    setGraphic(null);
                }
            }
        }
        
        private void createSelector(){
        	Object o = getItem();
        	if(o instanceof Integer){
        		createTextField();
        		setText(null);
                setGraphic(textField);
                textField.selectAll();	
        	}
        	
        	if(o instanceof Boolean){
        		createChoiceBox();
        		setText(null);
        		setGraphic(choiceBox);
        		choiceBox.selectionModelProperty();
        	}
        	
        	if(o instanceof IPropertieValues){
        		createChoiceMenu();
        		setText(null);        		
        		setGraphic(choice);        		
        	}
        }
 
        private void createChoiceMenu(){        	
        	final IPropertieValues pv = (IPropertieValues)getItem();
        	choice = new MenuButton();
        
        	setSize(choice);
        	
        	ObservableList<CheckMenuItem> cmi = FXCollections.observableArrayList();

        	for(Entry<IPort, Boolean> e : pv.getList().entrySet()){
        		CheckMenuItem item = new CheckMenuItem(e.getKey().getName());
        		item.setSelected(e.getValue());
        		cmi.add(item);
        	}
  
        	choice.getItems().addAll(cmi);
        	choice.setText(String.valueOf(pv.countSelectedItems()));
        	        	
        	for(final CheckMenuItem item : cmi){
        		item.selectedProperty().addListener(new ChangeListener<Boolean>() {
					@Override
					public void changed(
							ObservableValue<? extends Boolean> observable,
							Boolean oldValue, Boolean newValue) {
						
						if(newValue){
							pv.addSelectedItem(pv.getPortByName(item.getText()),true);
							choice.setText(String.valueOf(pv.countSelectedItems()));
							choice.arm();
							
						}else{
							pv.addSelectedItem(pv.getPortByName(item.getText()),false);
							choice.setText(String.valueOf(pv.countSelectedItems()));
						}
						
					}
				});
        	}
        }
        
        private void createChoiceBox(){
        	choiceBox = new ChoiceBox<Boolean>(FXCollections.observableArrayList(true,false));
        	choiceBox.setValue(Boolean.valueOf(getItem().toString()));
        	setSize(choiceBox);

        	choiceBox.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Boolean>(){
                @Override
                public void changed(ObservableValue<? extends Boolean> arg0, Boolean arg1, Boolean arg2) {
                        if (!arg2) {
                        	commitEdit(valueToString(String.valueOf(choiceBox.getValue())));
                            
                        }
                }
            });
            
            
        }
        
        private void createToggleButton(){
        	toggleButton = new ToggleButton();
        	toggleButton.setSelected(false);
        	setSize(toggleButton);
        	toggleButton.focusedProperty().addListener(new ChangeListener<Boolean>(){
                @Override
                public void changed(ObservableValue<? extends Boolean> arg0, Boolean arg1, Boolean arg2) {
                        if (!arg2) {
                            commitEdit(valueToString(String.valueOf(toggleButton.isSelected())));
                        }
                }
            });
        	
        }
        
        private void createTextField() {
            textField = new TextField(getString());
            setSize(textField);
            textField.focusedProperty().addListener(new ChangeListener<Boolean>(){
                @Override
                public void changed(ObservableValue<? extends Boolean> arg0, Boolean arg1, Boolean arg2) {
                        if (!arg2) {
                            commitEdit(valueToString(textField.getText()));
                        }
                }
            });
        }
        
        private void setSize(Control c){
        	c.setMinWidth(this.getWidth() - this.getGraphicTextGap()* 2);
        }
 
        private String getString() {
            return getItem() == null ? "" : getItem().toString();
        }
               
        private T valueToString(String s){
        	Object object = null;
        	        	
        	if(getItem() instanceof Integer)
        		object = Integer.parseInt(s);
        	
        	if(getItem() instanceof Boolean)
        		object = Boolean.parseBoolean(s);
        	
        	
        		
        	return (T) object;
        }
        
}

Den code hab ich mehr oder weniger von Oracle so übernommen und ausgebaut. Das mit dem auswählen aus dem ChoiceMenu klapt auch soweit nur wenn ich eine andere zelle bearbeite dann ist diese mit dem ChoiceMenu immer leer rein von der ansicht her. Hätt da gern nen String oder int wert stehe oder im ideal fall das der MenuButton permanent angezeigt wird und nicht nur wenn man die zelle doppelClicked
 

dzim

Top Contributor
Das Beispiel ist schon etwas unübersichtlich - was nicht deine Schuld ist, das liegt leider fast schon in der Natur der Sache.

Nur zu deinem Verständnis, was hier eigentlich passiert:
* im Normalzustand, zeige nur den Text
* wenn im Edit-Modus, dann zeige nur den Graphics-Node

Soweit ist es klar denke ich, aber es gibt da ein Problem: Du setzt jedes mal den Text auf null, was nicht nötig ist. Setze im Edit-Modus (#startEdit()-Methode) einfach das Flag
Java:
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
Wenn du den Edit-Modus beendest (#cancelEdit()) dann entsprechend
Java:
setContentDisplay(ContentDisplay.TEXT_ONLY);
Damit musst du nicht jedes Mal den Text löschen und hinzufügen.

Aber das ist eigentlich nur eine Randnotiz, denn du möchtest - wenn ich es richtig verstehe - das eigentlich vorne der Text steht und dahinter ein Menü-Knopf, oder?

Wenn ja, musst du in deiner #updateItem-Methode eigentlich nur wie oben genannt
Code:
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
setzen und am besten eine HBox mit einem Label und einem Button erstellen und in den Graphics-Node einfügen (ich finde immer noch, dass der Graphics-Node super toll ist, weil man eben eine komplette UI einfügen kann, aber denkbar beschissen benannt wurde - sicher, meist befüllt man es nur mit einem ImageView, aber trotzdem). Ein Klick auf den Button öffnet dann einfach ein Menü. Wenn das Dein Ziel ist und du hast das soweit und ärgerst dich, dass das Menü falsch positioniert wird, dann schreib noch einmal hier und ich poste den Code zu dem Menü mit korrekter Platzierung auch noch.

Wenn nein - dann erkläre es bitte noch einmal.
 
Zuletzt bearbeitet:

ZebaX

Mitglied
Ok ein Problem hätt ich noch wie... wie schaff ich es das von anfang an die richtigen Graphics angezeigt werden? Die werden ja momentan nur angezeigt nachdem ich das erste mal in der zelle war...
 

dzim

Top Contributor
Gibt es auch "falsche" Graphics??? Eher nein.

Wie gesagt: Einfach in #updateItem()
Code:
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
setzen. Wichtig ist nur: Du solltest den Graphics-Node natürlich auch mit Zeug befüllen. Sonst ist die Zelle einfach nur leer.
 

ZebaX

Mitglied
Also anfangs waren die zellen komplett leer ohne Graphic aber egal das ist gelöst nun aber zum nächsten problem.
Zum einen warum wird die updateMethode so oft aufgerufen, was auch steigt sobald ich eine weitere Zeile hinzufüge.
Und das andere ist das ständig meine Werte gelöscht werden sobald ich eine Zeile hinzufüge.

Hinzufügen geschieht durch das adden eines objects in die zur Tabelle gehörende ObservableList.
Das adden ansich geht auch nur das er alle werte löscht ;(
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Default table model aktualisieren AWT, Swing, JavaFX & SWT 7
J Anbindung Textfeldklasse an Table funktioniert nicht AWT, Swing, JavaFX & SWT 3
A JavaFX Daten in eine HTML-Table mit JS schreiben AWT, Swing, JavaFX & SWT 3
S JavaFX Boolean ändern Table View AWT, Swing, JavaFX & SWT 14
B JavaFX JavaFX Table gespeichertes Wert auswählen/anvisieren AWT, Swing, JavaFX & SWT 3
C TableModel zugehörige Table ermitteln AWT, Swing, JavaFX & SWT 3
T Table Renderer AWT, Swing, JavaFX & SWT 2
T Default Table wird nicht angezeigt AWT, Swing, JavaFX & SWT 15
E JavaFX Von der Table-Cell zur Row AWT, Swing, JavaFX & SWT 0
A JavaFX Table Delete Row AWT, Swing, JavaFX & SWT 5
N JavaFX Problem mit table multiple selection AWT, Swing, JavaFX & SWT 5
D JavaFX Table Filter AWT, Swing, JavaFX & SWT 4
R Swing JTable : Header der Spalten ergänzen mit caption (wie bei html-table) AWT, Swing, JavaFX & SWT 2
I JTable: Doppelklick auf Table soll neues Fenster öffnen und Daten aus JTable anzeigen AWT, Swing, JavaFX & SWT 4
J JTabbedPane: table in new tab: tooltip benutzt die column-widths von table in erstem geöffneten tab AWT, Swing, JavaFX & SWT 17
G Border der Komponente bei Table CellRenderer überschreiben AWT, Swing, JavaFX & SWT 0
M MouseListener auf table oder scrollPane AWT, Swing, JavaFX & SWT 11
T SWT checkbox in table AWT, Swing, JavaFX & SWT 6
C JTable Drag and Drop von Zeilen innerhalb einer Table AWT, Swing, JavaFX & SWT 2
T SWT Table (mit Spinner Spalte) Daten auslesen AWT, Swing, JavaFX & SWT 4
E extended Swing Table AWT, Swing, JavaFX & SWT 2
J Einträge aus Table löschen ohne Exception AWT, Swing, JavaFX & SWT 6
T Table-Zeilen mit Thread einfärben AWT, Swing, JavaFX & SWT 15
E SWT Popupmenu auf der Überschrift eines swt.widgets.Table verhindern? AWT, Swing, JavaFX & SWT 3
Nicklas2751 Table View zeigt keinen Inhalt nur leere Zeilen AWT, Swing, JavaFX & SWT 2
reibi SWT SWT - Table AWT, Swing, JavaFX & SWT 8
A Swing JButton in einer Table Cell AWT, Swing, JavaFX & SWT 9
lumo SWT JFace Databinding +Custom Table AWT, Swing, JavaFX & SWT 2
M SWT - Table deselecten AWT, Swing, JavaFX & SWT 2
R SWT | Table | Zeilenkopf AWT, Swing, JavaFX & SWT 2
M SWT Table disabled und Scrollbar enabled AWT, Swing, JavaFX & SWT 11
C [SWT] Widget Table verliert nach Sortierung farbige / eingefärbter Background / Zellen AWT, Swing, JavaFX & SWT 3
L Inhalt einer table löschen AWT, Swing, JavaFX & SWT 2
L Jbutton in table AWT, Swing, JavaFX & SWT 2
lumo SWT Table Selection Color +Focus Out AWT, Swing, JavaFX & SWT 14
S SWT Maximum an Items in Table? AWT, Swing, JavaFX & SWT 2
F SWT table refresh per Thread AWT, Swing, JavaFX & SWT 2
Q SWT Mindetsgröße für Table AWT, Swing, JavaFX & SWT 7
1 Swing manual resize table column to min size AWT, Swing, JavaFX & SWT 2
hdi SWT SWT Table: 2 kleine Probleme AWT, Swing, JavaFX & SWT 4
S SWT Table Größen verändern AWT, Swing, JavaFX & SWT 10
lumo SWT Table und Klassen AWT, Swing, JavaFX & SWT 14
lumo SWT Table CellEditor - knifflig AWT, Swing, JavaFX & SWT 35
M SWT Table mit Columns und Items AWT, Swing, JavaFX & SWT 3
L Java Table AWT, Swing, JavaFX & SWT 4
F Swing J(X)Table Spalten umsortieren NUR im View (Wie finde ich eine Spalte nach Name?) AWT, Swing, JavaFX & SWT 3
A SWT Table mit Bildern und Checkboxes AWT, Swing, JavaFX & SWT 4
A SWT Table hat keine Scrollbar AWT, Swing, JavaFX & SWT 12
A SWT Table clearAll() und zurücksetzen. AWT, Swing, JavaFX & SWT 3
K SWT Table Modell / Datenmodell AWT, Swing, JavaFX & SWT 14
S Table oder TableModel so ueberschreiben, dass Columns minimale Breite haben? AWT, Swing, JavaFX & SWT 2
T SWT - Table Events AWT, Swing, JavaFX & SWT 3
B SWT - Drag & Drop innerhalb einer Table AWT, Swing, JavaFX & SWT 3
T Fokus auf CB in Table mit beliebiger Taste AWT, Swing, JavaFX & SWT 12
S swt table mit checkboxen: wie nachträglich im code setzen? AWT, Swing, JavaFX & SWT 6
S Seltsam: SWT Table zeigt keine Scrollbar an AWT, Swing, JavaFX & SWT 12
G SWT-Table sortieren AWT, Swing, JavaFX & SWT 12
T Input-Check bei Textfeldern in Table AWT, Swing, JavaFX & SWT 5
G SWT Table Controll AWT, Swing, JavaFX & SWT 7
L SWT-Table: Datum ausgeben? AWT, Swing, JavaFX & SWT 5
G Table in SWT AWT, Swing, JavaFX & SWT 2
S Table Row per Drag and Drop in andere Table schieben? AWT, Swing, JavaFX & SWT 14
S SWT Table - Wie Columns hinzufügen / entfernen AWT, Swing, JavaFX & SWT 3
K javax.swing.table.TableRowSorter AWT, Swing, JavaFX & SWT 13
I JComboBox in Table AWT, Swing, JavaFX & SWT 4
G wo wird die table mit daten gefüllt? oô AWT, Swing, JavaFX & SWT 4
S SWT Drag&Drop / Table AWT, Swing, JavaFX & SWT 9
E JTable-während der Einfügezeit der Zellen in die Table AWT, Swing, JavaFX & SWT 2
S table - combobox AWT, Swing, JavaFX & SWT 7
D Selection SWT Table AWT, Swing, JavaFX & SWT 5
D SWT Table AWT, Swing, JavaFX & SWT 5
P Table Layout remove()? AWT, Swing, JavaFX & SWT 2
W Zeile in Table (SWT) selektieren und auslesen AWT, Swing, JavaFX & SWT 4
G Dringend ! SWT-Table übernimmt Änderung nicht AWT, Swing, JavaFX & SWT 2
L Multiline Table AWT, Swing, JavaFX & SWT 3
R SWT: Icons im Table vor den Einträgen AWT, Swing, JavaFX & SWT 3
T mit rechter maustaste Table row selektieren AWT, Swing, JavaFX & SWT 2
F Zeilenhöhe bei SWT Table AWT, Swing, JavaFX & SWT 3
S Nochmal Spaltenbriete im Table AWT, Swing, JavaFX & SWT 2
G mal wieder table. AWT, Swing, JavaFX & SWT 3
V SWT Table mit SWT.CHECK AWT, Swing, JavaFX & SWT 2
P SWT table updaten AWT, Swing, JavaFX & SWT 7
S Frage zu Table(Column)Model AWT, Swing, JavaFX & SWT 3
J ScrollPanel mit 2 Table`s AWT, Swing, JavaFX & SWT 5
J Table Model AWT, Swing, JavaFX & SWT 2
J Abstract Table Model AWT, Swing, JavaFX & SWT 7
T in einer Table soll jede zweite Zeile markiert werden AWT, Swing, JavaFX & SWT 3
E Inhalt einer Zelle eine Table in ein TextField bekommen AWT, Swing, JavaFX & SWT 24
Soloeco JavaFX Dreifachklick für MenuButton erforderlich AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben