2017-04-06 1 views
0

Ich habe eine Methode implementiert, so dass Benutzereingaben auf Dezimalformat gesetzt werden. Aber es gibt zwei Formen der Bearbeitung von JTable-Zellen (?).JTable edting mode

In einem von ihnen (erstes Bild), wenn der Benutzer einfach eine Zelle auswählt und zu schreiben beginnt, funktioniert mein Zellen-Editor nicht.

Aber in der anderen, wenn es doppelt auf die Zelle klickt der Editor.

Es gibt eine Möglichkeit, die Bearbeitung nur zuzulassen, wenn der Benutzer doppelt klickt?

PS .: isCellEditable und setClickCountToStart hat nicht funktioniert.

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 
import javax.swing.DefaultCellEditor; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextField; 
import javax.swing.border.EmptyBorder; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableColumn; 

public class example extends JFrame { 

    private JPanel contentPane; 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        example frame = new example(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    public example() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 450, 300); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     contentPane.setLayout(new BorderLayout(0, 0)); 
     setContentPane(contentPane); 

     JTable table = new JTable(new DefaultTableModel(new Object[]{"RB"}, 10)); 

     table.setPreferredScrollableViewportSize(new Dimension(700, 350)); 
     TableColumn RBColumn = table.getColumnModel().getColumn(0); 
     RBColumn.setCellEditor(new DefaultCellEditor(tfMon())); 

     JScrollPane scrollPane = new JScrollPane(table); 

     contentPane.add(scrollPane, BorderLayout.CENTER); 
    } 


    private JTextField tfMon(){ 
     JTextField tf = new JTextField(); 
     tf.addKeyListener(new KeyAdapter() { 
      public void keyTyped(KeyEvent e) { 
       char c = e.getKeyChar(); 
       if (!((c >= '0') && (c <= '9') || (c ==   KeyEvent.VK_BACK_SPACE) || (c == KeyEvent.VK_DELETE))){ 
        e.consume(); 
       }else{ 
        String txt = tf.getText(); 
        txt = txt.replace(".","").replace("0",""); 
        if(!((c == KeyEvent.VK_BACK_SPACE) || (c == KeyEvent.VK_DELETE))){ 
         e.consume(); 
         txt=txt+c; 
        } 
        while(txt.length()<3){ 
         txt="0"+txt; 
        } 
        txt = txt.substring(0,txt.length()-2)+"."+txt.substring(txt.length()-2,txt.length()); 
        tf.setText(txt); 
       } 
      } 
     }); 
      return tf; 
    } 
} 

Case 1 happens when user types in this condition enter image description here

Antwort

1

Es gibt eine Möglichkeit, die Bearbeitung nur, wenn der Benutzer doppelklickt zu ermöglichen?

Das Problem ist mit Ihrem Editor. Die Lösung sollte sein, den Editor zu reparieren, nicht zu verhindern, dass der Benutzer direkt in das Textfeld eintippt.

Ich bin nicht sicher, was Ihr Editor tut, aber es sieht so aus, als ob Sie nur Zahlen im Editor eingeben möchten.

Wenn dies der Fall ist, dann sollten Sie:

  1. Aufschalten der getColumnClass(...) Methode des TableModelInteger oder Double zurückzukehren. Dann verwendet die Tabelle einen geeigneten Editor, der nur die Eingabe numerischer Daten erlaubt. Sie müssen also keinen benutzerdefinierten Editor schreiben.

  2. Wenn Sie benutzerdefinierte Bearbeitung möchten, dann stattdessen eine JTextField verwenden können Sie eine JFormattedTextField verwenden, in dem Sie eine Maske angeben, um nur numerische Werte

  3. Schließlich erlauben die komplizierteste eine DocumentListener auf die verwenden würde Document des Textfelds (anstelle eines KeyListener). Die DocumentEvent wird generiert, wenn das Dokument geändert wird.

Edit:

Sie könnten in der Lage sein, Ihren Code zu erhalten, indem Sie arbeiten mit:

table.setSurrendersFocusOnKeystroke(true); 

Ich glaube, das die KeyEvents an die Redaktion auch passieren sollte, wenn die Zelle nicht in ist Bearbeitungsmodus.

Eigentlich erinnerte ich mich gerade daran, dass ich vielleicht eine bessere Lösung habe. Verwenden Sie ein benutzerdefiniertes JTextField, um die Logik anstelle eines KeyListener zu implementieren. Überprüfen Sie den Code in: Make a JFormattedTextField behave like ATM input

Ich habe nicht versucht, dieses Textfeld als Editor verwenden, aber ich sehe keinen Grund, warum es nicht funktioniert, da die Logik nicht auf KeyEvents basiert.

+0

ändert Mein Editor den Text der Zelle als etwas Benutzertypen. Zellen sollten bei 0,00 beginnen, und wenn Benutzer Typ 1 geht es zu 0,01, und so weiter, also wenn er 1 und 2 gibt, wird es 0,12, für 1,2 und 3 wird es 1,23. Es funktioniert gut, wenn der Benutzer auf die Zelle doppelklickt. –

+0

@FelipeHogrefeBento, und ich gab Ihnen 3 mögliche Lösungen. – camickr

+0

Aber wie kann eine Zelle auf zwei Arten bearbeitet werden? –