JSpinner als TableCellEditor; buttons nur bei fokus sichtbar

mrks.js

Mitglied
Hallo, ich habe mir einen TableCellEditor zusammengeklaut, der aus einer meiner Tabellenspalten statt dem normalen textfeld einen jspinner macht. das funktioniert soweit auch, nur werden die previous/next-buttons des spinners erst beim fokus auf das feld sichtbar gesetzt. ich habe die anforderung, dass die buttons (so wie bei jedem spinner) immer sichtbar sind, ob die zelle den fokus hat oder nicht.

Java:
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;

public class Spinner {
    public static void main(String[] args) {
        JTable table = new JTable(2, 1);

        // Set up the table
        table.getColumnModel().getColumn(0).setCellEditor(new
                NumberSpinnerTableCellEditor());
        
        table.getModel().setValueAt(new Integer(0), 0, 0);
        table.getModel().setValueAt(new Integer(0), 1, 0);
        JScrollPane scrollPane = new JScrollPane(table);

        // Put the areas on one panel
        JPanel contentPane = new JPanel(new BorderLayout());
        contentPane.add(scrollPane, BorderLayout.CENTER);

        // Show the frame
        JFrame frame = new JFrame("Spinner Editor Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(contentPane);
        frame.pack();
        frame.setVisible(true);
    }

    // The "Spinner" editor for the table.
    private static class NumberSpinnerTableCellEditor extends
            AbstractCellEditor implements TableCellEditor {

        private JSpinner editor;

        public NumberSpinnerTableCellEditor() {
            editor = new JSpinner();
            editor.setBorder(null);
        }

        public Object getCellEditorValue() {
            return editor.getValue();
        }

        public Component getTableCellEditorComponent(JTable table, Object value,
                boolean isSelected, int row, int column) {

            editor.setValue(value);

            return editor;
        }
    }
 
}
 

mrks.js

Mitglied
vielen dank für deine rückmeldung!

ich habe nun
Java:
    private static class NumberSpinnerTableCellRenderer extends DefaultTableCellRenderer {
    	public NumberSpinnerTableCellRenderer() {
    		super();
    	}
    }

und

Java:
table.getColumnModel().getColumn(0).setCellRenderer(new NumberSpinnerTableCellRenderer());

hinzugefügt. jedoch ändert das nichts an der darstellung. ich nehme mal stark an, dass ich noch setValue(Object value) überschreiben muss? aber wohin schreibe ich den wert? ich kann ja nicht nochmal ein jspinner objekt in meiner renderer methode hinzufügen? wäre ja redundant?!
 

Michael...

Top Contributor
Du musst genauso wie beim Editor einen JSpinner eben als Renderer erzeugen und die
Code:
getTableCellRendererComponent()
des DefaultTableCellRenderer überschreiben.

so in etwa:
Java:
private static class NumberSpinnerTableCellRenderer extends DefaultTableCellRenderer {
        JSpinner renderer;
        public NumberSpinnerTableCellRenderer() {
            renderer = new JSpinner();
        }
        
        public Component getTableCellRendererComponent(... {
            renderer.setValue(value);
            return renderer;
        }
}
 

mrks.js

Mitglied
super! ich danke dir!
lerne jeden tag was zu swing dazu...

also muss ich auf rendern und auf edits reagieren und jedesmal wird mir der aktualisierte spinner zurückgegeben.


hier nochmal der komplette code:

Java:
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;

public class Spinner {
    public static void main(String[] args) {
    	
        JTable table = new JTable(2, 1);

        // Set up the table
        table.getColumnModel().getColumn(0).setCellRenderer(new NumberSpinnerTableCellRenderer());
        table.getColumnModel().getColumn(0).setCellEditor(new
                NumberSpinnerTableCellEditor());
        
        table.getModel().setValueAt(new Integer(0), 0, 0);
        table.getModel().setValueAt(new Integer(0), 1, 0);
        JScrollPane scrollPane = new JScrollPane(table);

        // Put the areas on one panel
        JPanel contentPane = new JPanel(new BorderLayout());
        contentPane.add(scrollPane, BorderLayout.CENTER);

        // Show the frame
        JFrame frame = new JFrame("Spinner Editor Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(contentPane);
        frame.pack();
        frame.setVisible(true);
    }

    // The "Spinner" editor for the table.
    private static class NumberSpinnerTableCellEditor extends
            AbstractCellEditor implements TableCellEditor {

        private JSpinner editor;

        public NumberSpinnerTableCellEditor() {
        	
            editor = new JSpinner();
            editor.setBorder(null);
        }

        public Object getCellEditorValue() {
        	
            return editor.getValue();
        }

        public Component getTableCellEditorComponent(JTable table, Object value,
                boolean isSelected, int row, int column) {

            editor.setValue(value);
            return editor;
        }
    }
    private static class NumberSpinnerTableCellRenderer extends DefaultTableCellRenderer {
    	
    	JSpinner renderer;
    	public NumberSpinnerTableCellRenderer() {
    		renderer = new JSpinner();
    		renderer.setBorder(null);
    	}
    	
    	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {

    		renderer.setValue(value);
            return renderer;
        }
    }

}
 
Zuletzt bearbeitet:

mrks.js

Mitglied
Ich nochmal:

mir ist mittlerweile aufgefallen, dass sich die vom spinner veränderbaren werte erst durch einen mausklick auf ein anderes feld in der tabelle verändern. wo müsste ich ansetzen, dass mit jedem klick des spinner mehr/weniger buttons das attribut dahinter geändert wird? ich nehme mal an da muss ich händisch irgendwo ein firetablefireTableDataChanged() hinzufügen, nur wo?
 
Zuletzt bearbeitet:

Michael...

Top Contributor
mir ist mittlerweile aufgefallen, dass die vom spinner veränderbaren werte erst durch einen mausklick auf ein anderes feld in der tabelle verändern.
Korrekt der Wert des Editors wird erst nach dessen Beenden an das TableModel übergeben.
Wenn die Werte bereits während dem hin und her ziehen ins Datenmodel der Tabelle sollen, müsste man einen Listener (weiss jetzt aus dem stegreif nicht welchen) an dem Spinner registrieren und über diesen dann das Datenmodel aktualisieren, z.B. mit setValueAt(...)
 

mrks.js

Mitglied
das heisst ich müsste mir ein spinnermodel implementieren (das habe ich bereits gemacht) und in dem fall wo die getNextValue() bzw getPreviousValue() methode aufgerufen wird ein update der tabelle abfeuern? wie greife ich jedoch auf die update methode der anderen komponente zu? die ist ja nicht ohne objekt erreichbar.
 

Michael...

Top Contributor
das heisst ich müsste mir ein spinnermodel implementieren (das habe ich bereits gemacht) und in dem fall wo die getNextValue() bzw getPreviousValue() methode aufgerufen wird ein update der tabelle abfeuern?
Ob da das Spinnermodel der geeignete Platz ist - würde eher sagen nein.
Ausserdem musst Du nicht ein update ala fireTable... feuern, sondern Du musst aktiv das Datenmodel der Tabelle ändern (solange die den Schieber hin und herschiebst, ändert sich noch nichts an den Daten in der Tabelle) sofern das Datenmodel richtig implementiert ist, feuert dieses von alleine das Event ab.

Ich würde innerhalb des CellEditors einfach einen ChangeListener an den JSpinner anhängen, schließlich muss man sich ja auch merken an welcher Zelle der Editor gestartet wurde.
 

mrks.js

Mitglied
das hört sich grade wieder zu astronautisch an, ich werde das morgen einmal ausprobieren, wenn mein kopf wieder funktionert.
danke schonmal für Deine rückmeldung!
 

mrks.js

Mitglied
so. jetzt hab ich mir einen changelistener geschrieben der den wert des spinners ausspuckt. wie bekomme ich den jetzt in meine tabelle? ich sehe keine möglichkeit an die herkunft des spinners heranzukommen damit ich gezielt eine zelle updaten könnte!
 

mrks.js

Mitglied
jetzt hab ichs! glaub ich..

ich musste allerdings die tabelle aus meiner gui klasse sichtbar machen, das ist nicht so schön, aber hier gilt wohl "design" follows function..

mittels table.getEditingColumn() Reporter.table.getEditingRow() kann ich die aktuelle spalte und reihe abfragen von der das event gefeuert wurde, mit diesen informationen und dem wert aus dem spinner kann ich den wert dann per table.setValueAt(...) setzen.

ich danke Dir schon wieder!

für wissbegierige:

Java:
import javax.swing.AbstractSpinnerModel;
import javax.swing.JSpinner;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class SpinnerChangeListener implements ChangeListener {

	JSpinner source;
	AbstractSpinnerModel model;
	Object data;
	double value;
	
	public void stateChanged(ChangeEvent e) {

		if (Reporter.table.getEditingColumn() >= 0
				&& Reporter.table.getEditingRow() >= 0) {

			source = (JSpinner) e.getSource();
			model = (AbstractSpinnerModel) source
					.getModel();
			data = model.getValue();
			value = Double.parseDouble(data.toString());

			System.out.println("new value " + value);

			Reporter.table.setValueAt(data, Reporter.table.getEditingRow(),
					Reporter.table.getEditingColumn());

		}
	}
}
 

Michael...

Top Contributor
Wenn der Listener den CellEditor kennt oder eine innere Klasse der CellEditors ist kannst Du Dir ja bei jedem Aufruf von getTableCellEditorComponent(JTable table, ..., int row, int column) die Referenz der Tabelle, die Reihe und die Spalte in einer globalen Instanzvariablen speichern, kannst vom Listener aus darauf zugreifen und ersparst Dir diese Abhängigkeiten.

"design" follows function ist in den wenigsten Fällen eine die bessere Wahl ;-)
 

mrks.js

Mitglied
stimmt, das ist definitiv eleganter!
werde ich nach meiner mittagspause implementieren.
vielen Dank nochmal für Deine Mühe!
darf man fragen wie lange Du dich schon mit java und mit oberflächen beschäftigst? beruflich?
 

Michael...

Top Contributor
darf man fragen wie lange Du dich schon mit java und mit oberflächen beschäftigst?
Java kenne ich seit '98 und hatte seit dem mehr oder weniger mit zu tun. Mit kleineren Oberflächen hat man ja immer wieder mal zu tun, so richtig setzte ich mich seit 2-3 Jahren damit auseinander.
Entwickle zwar kleinere Anwendungen und Frontends für Datenbanken, werde aber offiziell nicht dafür bezahlt. Offizielle Software wird bei uns von externen Firmen entwickelt. Ein Tochterunternehmen, welches früher Software für uns entwickelt hat wurde leider vor zwei Jahren verkauft, daher beschäftige ich mich eher mit Einkaufen und Beauftragen von Softwareentwicklungen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D TAB Taste innerhalb eines JSpinner AWT, Swing, JavaFX & SWT 2
C JSpinner AWT, Swing, JavaFX & SWT 6
C Hilfe bei JSpinner und JList AWT, Swing, JavaFX & SWT 1
K Swing JSpinner mit NULL AWT, Swing, JavaFX & SWT 3
V LookAndFeel JSpinner Hintergrund Farbe mit Nimbus LaF AWT, Swing, JavaFX & SWT 0
R Int aus JSpinner auslesen und Tabelle erstellen AWT, Swing, JavaFX & SWT 3
K JSpinner in passender Breite erstellen oder automatisch anpassen AWT, Swing, JavaFX & SWT 2
D JCheckbox und JSpinner in JTable AWT, Swing, JavaFX & SWT 9
M JSpinner, setValue AWT, Swing, JavaFX & SWT 7
N Swing JSpinner mit Datum aber ohne Uhrzeit AWT, Swing, JavaFX & SWT 2
J Swing JSpinner mit zusätzlichem Text? AWT, Swing, JavaFX & SWT 2
B JSpinner ChangeEvent erzwingen AWT, Swing, JavaFX & SWT 6
B JSpinner Textgröße anpassen AWT, Swing, JavaFX & SWT 2
B JSpinner welche Taste? AWT, Swing, JavaFX & SWT 5
B JSpinner Enter AWT, Swing, JavaFX & SWT 7
G JSpinner ohne Tausendertrennzeichen AWT, Swing, JavaFX & SWT 5
N Wertanzeige mittels JSpinner AWT, Swing, JavaFX & SWT 3
S JSpinner AWT, Swing, JavaFX & SWT 11
G Swing JSpinner nur mit Buttons ändern AWT, Swing, JavaFX & SWT 8
T JSpinner in JTable: Problem beim Auslesen, funktioniert erst beim Zellwechsel AWT, Swing, JavaFX & SWT 7
T Swing JSpinner in JTable AWT, Swing, JavaFX & SWT 9
C Größe von JSpinner fixieren AWT, Swing, JavaFX & SWT 4
J JSpinner + SpinnerNumberModel int auslesen AWT, Swing, JavaFX & SWT 2
C Zwei JSpinner mit dem gleichen Wert AWT, Swing, JavaFX & SWT 2
Eldorado Swing Popup-Menü mit Jspinner AWT, Swing, JavaFX & SWT 4
X Den Wert von JSpinner setzen ohne Event AWT, Swing, JavaFX & SWT 3
M JSpinner Font ändern AWT, Swing, JavaFX & SWT 4
Spin JSpinner AWT, Swing, JavaFX & SWT 10
T JSpinner, 3 JSpinner aber nur ein SpinnerDateModel AWT, Swing, JavaFX & SWT 7
S JSpinner der Floats anzeigt..? AWT, Swing, JavaFX & SWT 4
D Swing Eigene Komponente mit JSpinner AWT, Swing, JavaFX & SWT 4
elitebiber Swing JSpinner und die Zeit AWT, Swing, JavaFX & SWT 11
T JSpinner Problem AWT, Swing, JavaFX & SWT 6
G JSpinner umdrehen? AWT, Swing, JavaFX & SWT 2
G JSpinner und ChangeListener AWT, Swing, JavaFX & SWT 3
K JSpinner - Model <-> View, unterschiedliche Werte AWT, Swing, JavaFX & SWT 9
Tom299 JSpinner nur Zeitangabe AWT, Swing, JavaFX & SWT 13
G JSpinner Frage AWT, Swing, JavaFX & SWT 2
H JSpinner mit Kalenderwoche und Jahr AWT, Swing, JavaFX & SWT 6
M JSpinner in einer JTable? AWT, Swing, JavaFX & SWT 5
P Frage zu JSpinner AWT, Swing, JavaFX & SWT 3
B JTextFiled, JCheckBox, JSpinner Eigenschaften speichern AWT, Swing, JavaFX & SWT 2
R Konvertieren von Werten im JSpinner AWT, Swing, JavaFX & SWT 2
K JSpinner Werte verschwinden bei Panel Wechsel AWT, Swing, JavaFX & SWT 2
B JSpinner passt optisch nicht zu anderen Komponenten AWT, Swing, JavaFX & SWT 2
D JSpinner ohne Edit Möglichkeit AWT, Swing, JavaFX & SWT 5
J JSpinner mit zahlen AWT, Swing, JavaFX & SWT 10
P JSpinner Objekt anstatt Zahlen sollen man Namen auswählen AWT, Swing, JavaFX & SWT 2
L JSpinner + addRow() AWT, Swing, JavaFX & SWT 3
M .txt unter Verwendung von JSpinner in Textfeld schreiben AWT, Swing, JavaFX & SWT 4
N JDK1.4- Überladen d. Methoden getValue setValue von JSpinner AWT, Swing, JavaFX & SWT 2
S JSpinner: Editieren einschränken AWT, Swing, JavaFX & SWT 4
F JSpinner FocusListener AWT, Swing, JavaFX & SWT 2
W JSpinner: Button vertikal anordnen AWT, Swing, JavaFX & SWT 2
R JSpinner rotieren AWT, Swing, JavaFX & SWT 6
A JSpinner in Dialogbox integrieren? AWT, Swing, JavaFX & SWT 3
D JSPinner Größe verändern - setSize() funktioniert nicht AWT, Swing, JavaFX & SWT 7
javasdann JSpinner & KeyListener. AWT, Swing, JavaFX & SWT 8
G jspinner schrittweite in Abhängigkeit vom aktuellen Wert AWT, Swing, JavaFX & SWT 3
G JSpinner bringt bei anklicken eine CastException AWT, Swing, JavaFX & SWT 5
flashfactor Un mal ein Problem mit JSpinner AWT, Swing, JavaFX & SWT 7
I jSpinner.getValue() AWT, Swing, JavaFX & SWT 2
G JSpinner für Datumsanzeige AWT, Swing, JavaFX & SWT 2
H JTable TableCellEditor-Problem AWT, Swing, JavaFX & SWT 0
C Swing Spinner als TableCellEditor - Text zu klein AWT, Swing, JavaFX & SWT 2
N Tutorial für TableCellEditor AWT, Swing, JavaFX & SWT 1
S JTable & TableCellEditor Problem AWT, Swing, JavaFX & SWT 5
M JTable: TableCellEditor nach Eingabe sofort beenden? AWT, Swing, JavaFX & SWT 3
M JPanel mit Textfeld als TableCellEditor AWT, Swing, JavaFX & SWT 9
E TableCellEditor für jede Zelle AWT, Swing, JavaFX & SWT 4
m@nu Problem mit eigener TableCellEditor-Impelemtierung AWT, Swing, JavaFX & SWT 5
D Fehler im TableCellEditor? AWT, Swing, JavaFX & SWT 2
R TableCellEditor -> editieren stoppen AWT, Swing, JavaFX & SWT 4
XWing Basic JPanel mit 2 Buttons beutzen. AWT, Swing, JavaFX & SWT 10
jojoge Wie erstelle ich runde Buttons mit Farbe? AWT, Swing, JavaFX & SWT 1
berserkerdq2 Buttons und Shapes sehen ja nach Screengröße klein oder zu groß aus, jemand eine Idee, was man tun kann? AWT, Swing, JavaFX & SWT 1
H Swing Buttons erst nach Klick sichtbar AWT, Swing, JavaFX & SWT 13
volcanos SpringLayout mit zusätzlichen Buttons außerhalb des SpringLayout AWT, Swing, JavaFX & SWT 33
K Swing Buttons erst blinken lassen und dann abfragen, ob sie gedrückt worden sind AWT, Swing, JavaFX & SWT 2
Z Switch Case für Buttons AWT, Swing, JavaFX & SWT 8
O Swing JOptionPane.showOptionDialog - Wie kann ich Buttons größer machen AWT, Swing, JavaFX & SWT 10
R mehrere buttons mit forschleife kreieren und individuell bearbeiten AWT, Swing, JavaFX & SWT 1
Z Swing Kann man denn abstand zwischen zwei Buttons berechnen AWT, Swing, JavaFX & SWT 5
B JavaFX DropDown Menu mit ausführbaren Buttons AWT, Swing, JavaFX & SWT 1
VPChief Buttons Reagieren erst wenn ich Fenster minimiere AWT, Swing, JavaFX & SWT 4
ms_cikar Jbutton erzeugt neue Buttons AWT, Swing, JavaFX & SWT 2
K Buttons dynamisch erstellen (NetBeans) AWT, Swing, JavaFX & SWT 10
S Kreis vergrößern/verkleinern mit Buttons AWT, Swing, JavaFX & SWT 1
J JavaFX von einem Array aus Buttons herausfinden auf welcher geklickt wurde aus dem Array. AWT, Swing, JavaFX & SWT 1
xYurisha ActionListener Methoden Buttons zuweisen! AWT, Swing, JavaFX & SWT 16
xYurisha Aus einer Gui Buttons, Label und ProgessBars entfernen AWT, Swing, JavaFX & SWT 4
CptK Wieso wird nur ein Teil meiner Buttons angezeigt? AWT, Swing, JavaFX & SWT 1
J Ziehen eines Buttons im JPanel AWT, Swing, JavaFX & SWT 2
J Drag and Drop eines Buttons AWT, Swing, JavaFX & SWT 0
J TicTacToe Buttons AWT, Swing, JavaFX & SWT 14
J ActionListener bei Buttons AWT, Swing, JavaFX & SWT 14
DaCrazyJavaExpert Swing Extern den Text eines nicht fetsgelegten Buttons bekommen. AWT, Swing, JavaFX & SWT 12
T Swing Double Click bei Buttons in JTable AWT, Swing, JavaFX & SWT 9
C Buttons funtionieren nicht AWT, Swing, JavaFX & SWT 10
S SWT neues Fenster, buttons aus alten etc... AWT, Swing, JavaFX & SWT 0

Ähnliche Java Themen

Neue Themen


Oben