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.
und hier ein CellEditor mit dem das weitergehen mit ENTER funktioniert (Hab ich hier aus dem Forum)
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;
}
}