von Button zu Zelle in Tabelle- zu anderer Zelle springen

kleinfritzchen

Aktives Mitglied
Hallo,
ich möchte in einer Tabelle per Button eine Zeile in einer Tabelle anfügen (was auch funktioniert soweit). Der Focus soll nach anfügen der Zeile in die erste Zelle dieser zeile springen sodas ich dort etwas eingeben kann.
Wie geht das am einfachsten und wie kann ich es anstellen damit ich per enter danach in eine andere Bestimmze Zelle springe und von dort aus dann auf einen andern Buttun.
Muss ich das mit einer Fokusreihenfolge machen? Und wie geht das innerhalb einer Component wie einer JTable?
ich such hier keine fertige Lösung sondern nur den Ansatz der am einfachsten ist!

hier mal eine TestTabelle ohne zeilenanfügen nur um das mit dem Fokus hinzubekommen.
Java:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;

public class Tabelle {
	
	JPanel panel, pnlTasten;
	JButton edit, fertig;
	JScrollPane scp;
	JTable tab;
	
	Tabelle(){
		JFrame f=new JFrame();
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		erstellen();
		f.getContentPane().add(panel);
		f.pack();
		f.setLocationRelativeTo(null);
		
		f.setVisible(true);
	}

	private void erstellen() {

		panel=new JPanel(new BorderLayout());
		tab=new JTable(4,3);
		tab.editCellAt(4, 0);
		tab.setDefaultEditor(String.class, new TabelleCellEditor("####","abcdefghi","",4d,4d ));
		scp=new JScrollPane(tab);
		pnlTasten=new JPanel();
		edit=new JButton("Edit");
		edit.addActionListener(new MeinActionHorcher());
		fertig=new JButton("Fertig");
		fertig.addActionListener(new MeinActionHorcher());
		
		
//		scp.add(tab);
		panel.add(scp, BorderLayout.NORTH);
		pnlTasten.add(edit);
		pnlTasten.add(fertig);
		panel.add(pnlTasten, BorderLayout.SOUTH);
		
		
		
	}
	public static void main(String[] args) {
		new Tabelle();
	}
	 
	
	public class MeinActionHorcher implements ActionListener{

		@Override
		public void actionPerformed(ActionEvent e) {

			if (e.getSource() == edit){
				System.out.println("Edit wurde gecrückt");
				tab.setEditingRow(3);
			}
			if (e.getSource()==fertig){
				System.out.println("fertig wurde gedrückt");
			}
		}
		 
	 }

	
}

und hier ein CellEditor mit dem das weitergehen mit ENTER funktioniert (Hab ich hier aus dem Forum)
Java:
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.util.EventObject;

import javax.swing.AbstractCellEditor;
import javax.swing.InputVerifier;
import javax.swing.JComponent;
import javax.swing.JFormattedTextField;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.table.TableCellEditor;
import javax.swing.text.JTextComponent;
import javax.swing.text.MaskFormatter;

public class TabelleCellEditor extends AbstractCellEditor implements TableCellEditor{
	
	
	 JFormattedTextField ftf;
	    MaskFormatter formatter;
	 
	    public TabelleCellEditor(String maske, String erlaubt, String platzhalter, Double min, Double max) {
	        if (maske.equals("") == false) {
	            try {
	                formatter = new MaskFormatter(maske); // Formatmaske
	                if (erlaubt.equals("") == false) {
	                    formatter.setValidCharacters(erlaubt); // Gueltige Zeichen
	                }
	                if (platzhalter.equals("") == false) {
	                    formatter.setPlaceholder(platzhalter); // Platzhalter
	                }
	                ftf = new JFormattedTextField(formatter);
	            } catch (Exception e) {
	            }
	        } else {
	            ftf = new JFormattedTextField(); // wenn keine Formatter-Informationen uebergeben werden
	        }
	        ftf.setInputVerifier(new MyInputVerifier(min, max));
	        ftf.addActionListener(new ActionListener() {
	            public void actionPerformed(ActionEvent e) {
	                stopCellEditing();
	            }
	        });
	    }
	 
	    // Zelle schon nach einfachem Klick editierbar
	    @Override
	    public boolean isCellEditable(EventObject anEvent) {
	        if (anEvent instanceof MouseEvent) {
	            return ((MouseEvent) anEvent).getClickCount() >= 1;  
	        }
	        return true;
	    }
	 
	    public Object getCellEditorValue() {
	        return ftf.getText().trim(); // eingebener Wert wird übernommen
	    }
	 
	    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
	        String stringValue = (String) value;
	        try {
	            stringValue.trim();
	        } catch (Exception e) {
	        }
	        ftf.setText((stringValue).trim());
	        return ftf;
	    }
	 
//	     Focuswechsel verhindern bei ungueltiger Eingabe
	    @Override
	    public boolean stopCellEditing() {
	        if (ftf.getInputVerifier().shouldYieldFocus(ftf) == true) {
	            fireEditingStopped();
	            return true;
	        } else {
	            return false;
	        }
	    }
	}
	 
	// Eingabepruefung
	class MyInputVerifier extends InputVerifier {
	 
	    private Object min, max;
	 
	    public MyInputVerifier(Object dmin, Object dmax) {
	        min = dmin;
	        max = dmax;
	    }
	 
	    public boolean verify(JComponent input) {
	        if (!(input instanceof JTextComponent)) {
	            return false;
	        }
	        if (min==null & max==null){
	            return true;
	        }
	        JTextComponent comp = (JTextComponent) input;
	        Double val = null;
	        try {
	            val = Double.parseDouble(comp.getText().trim());
	        } catch (NumberFormatException ex) {
	            JOptionPane.showMessageDialog(null, "NumberFormatException in Inputverifier!", "Hinweis", JOptionPane.INFORMATION_MESSAGE);
	        }
	        Boolean gueltig = (val >= (Double) min && val <= (Double) max);
	        if (gueltig == false) {
	            JOptionPane.showMessageDialog(null, "Der eingegebene Wert " + val + " liegt nicht im gültigen Bereich von " + min + " bis " + max + "!", "Hinweis", JOptionPane.INFORMATION_MESSAGE);
	        }
	        return gueltig;
	    }

}
 

Kevin94

Top Contributor
Mal vorneweg: Allein von deiner Beschreibung hab ich keinen Plan wie deine GUI funktionieren soll, aber es hört sich stark nach wild in einer Tabelle herumspringen an, ohne eine intuitive Ordnung. Vielleicht solltest du dir den Aufbau deiner Tabelle noch mal überdenken?

Das eine bestimmte Zelle selektiert ist (und damit den Fokus hat), kann man mit changeSelection erzwingen, ob das auch dazuführt, dass sie in einem Scrollpane sichtbar ist weis ich nicht.

Zum Rest: Was stört dich an der Standartbedienweise von JTabel's? Selection/Fokusierte Zelle mit Pfeiltasten verschieben, mit F2 editieren und mit Tab in die nächste Zelle springen (Die nächste Zelle ist immer die rechts davon bzw. die erste Zelle der nächsten Zeile, was die Fokusreihenfolge innerhalb einer JTable ist).
 

kleinfritzchen

Aktives Mitglied
Hallo,
in der Tabelle sind Daten die ich nur über die Tabelle sichtbar mache und der einfachheit dort auch bearbeiten möchte. Durch den HinzufügenButton wird einfach ein lerer Datensatz (Zeile) an die Tabelle angefügt der anschließend bearbeitet werden soll. Im TableModel kann ich ja festlegen das nach dem Hinzufügen nur diese Zeile bearbeitet werden kann.
Diese Tabelle kann aber 2 verschieden Datentypen enthalten. es wird über einen RadioButton gewählt was für Daten angezeigt werden sollen und dementsprechend sieht die Tabelle halt aus.
Das was mich stört ist das wenn ich die letzte Zelle bearbeitet hab nach einem ENTER in der Tabelle wieder nach ganz oben gesprungen wird hier soll aber ein Sprung auf den "Fertig" Button geschehen und dafür hab ich noch keine Lösung. Wenns nicht einfacher geht dann werd ich wohl eine Fokusreihenfolge festlegen müssen.

MfG Fritz
 

Neue Themen


Oben