2017-11-18 1 views
0

Ich habe ein Problem mit dem Cursor in JTable. Ich habe versucht, eine Antwort im Forum zu finden, kann aber nicht die Antwort finden, die ich erwartet habe. Hier ist meine runnable Java:Cursor blinkt automatisch in Jtable ohne Mausklick

import java.awt.EventQueue; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.border.EmptyBorder; 
import javax.swing.table.AbstractTableModel; 
import javax.swing.JLabel; 
import java.awt.Font; 
import javax.swing.SwingConstants; 
import javax.swing.JTable; 

public class Fpos extends JFrame { 

     public static void main(String[] args) { 
       EventQueue.invokeLater(new Runnable() { 
         public void run() { 
           try { 
            Fpos frame = new Fpos(); 
            frame.setVisible(true); 
            frame.setLocationRelativeTo(null); //make frame center of screen     
           } catch (Exception e) { 
            e.printStackTrace(); 
           } 
         } 
       }); 
     } 


     public Fpos() { 
       //create Jpanel 
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       setBounds(10, 10, 1300, 700); 
       JPanel contentPane = new JPanel(); 
       contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
       setContentPane(contentPane); 
       contentPane.setLayout(null); 
       //create label TOTAL 
       JLabel lblTotal = new JLabel("TOTAL : Rp."); 
       lblTotal.setFont(new Font("Wide Latin", Font.PLAIN, 30)); 
       lblTotal.setBounds(33, 25, 312, 31); 
       contentPane.add(lblTotal); 
       //create label Total Amount 
       JLabel lblNewLabel = new JLabel("123,456,789"); 
       lblNewLabel.setHorizontalAlignment(SwingConstants.RIGHT); 
       lblNewLabel.setFont(new Font("Wide Latin", Font.PLAIN, 60)); 
       lblNewLabel.setBounds(571, 6, 659, 61); 
       contentPane.add(lblNewLabel); 
       //create jtable in scrollpane 
       JTable table = new JTable(new MyTableModel());     
       JScrollPane sp=new JScrollPane(table); 
       sp.setBounds(20,76,1240,572); 
       contentPane.add(sp);    
     } 

    //tablemodel 
    class MyTableModel extends AbstractTableModel { 
      private String[] columnNames = {"PLU", "NAME", "UOM", "QTY", "PRICE","AMOUNT"}; 
      private Object[][] data = {{"", "", "", new Double(0), new Integer(0), new Integer(0)}};  
      public int getColumnCount() {return columnNames.length;} 
      public int getRowCount() {return data.length;} 
//   public String getColumnName(int col) {return columnNames[col];} 
      public Object getValueAt(int row, int col) {return data[row][col];} 
      //auto formating table: string=left alignment, numeric=right alignment, checkbox=check box not true/false 
      public Class getColumnClass(int c) {return getValueAt(0, c).getClass();} 
      //make table editable only for just first column   
      public boolean isCellEditable(int row, int col) {if (col == 0) {return true;} else{return false;}} 
      //make table can change value   
      public void setValueAt(Object value, int row, int col) { 
        data[row][col] = value; 
        fireTableCellUpdated(row, col); 
      } 
    } 

} 

Der Ausgang ist nur gut, aber der Tisch ist nicht eingabebereit zu sein. Ich muss auf Spalte PLU erste Zeile doppelklicken, um für die Eingabe bereit zu sein. Was ich will ist, sobald ich es ausführen, Cursor blinkt in Spalte PLU erste Zeile, bereit für die Eingabe ohne Doppelklick.

Irgendwelche Vorschläge, wie man das erreicht?

+2

Werfen Sie einen Blick auf [ 'JTable # editCellAt'] (https://docs.oracle.com/javase/8/docs/api/javax/swing/JTable.html# editCellAt-int-int-) – MadProgrammer

+0

Dank MadProgrammer, ich habe die Lösung gefunden. Ich habe eine neue Frage hier https://stackoverflow.com/questions/47447780/key-binding-in-jtable-editor geschrieben. seine Tastaturbindung ist an den Tabelleneditor und nicht an die Tabelle gebunden. Hoffe, du kannst auch helfen. – Hendra

Antwort

0

wären die Grundlagen:

table.changeSelection(0, 0, false, false); 

if (table.editCellAt(0, 0)) 
{ 
    Component editor = table.getEditorComponent(); 
    editor.requestFocusInWindow(); 
    //((JTextComponent)editor).selectAll(); 
} 

Die changeSelection(...) ist auf der Reihe wie klicken (so die gesamte Zeile markiert wird), dann die editCellAt(...) Stellen der Zelle im Bearbeitungsmodus.

Dann müssen Sie den Fokus auf den Editor setzen und optional den gesamten Text auswählen, damit er während der Eingabe ersetzt werden kann.

Edit:

Der Cursor noch nicht blinkt

Wickeln Sie den Code in einem SwingUtilities.invokeLater(...) um sicherzustellen, dass der Code ausgeführt wird, nachdem der Rahmen sichtbar ist:

SwingUtilities.invokeLater(new Runnable() 
{ 
    public void run() 
    { 
     table.changeSelection(0, 1, false, false); 

     if (table.editCellAt(0, 1)) 
     { 
      Component editor = table.getEditorComponent(); 
      editor.requestFocusInWindow(); 
      //((JTextComponent)editor).selectAll(); 
     } 
    } 
}); 
+0

danke Camickr für Ihre schnelle Antwort. – Hendra

+0

Vielen Dank Camickr für Ihre schnelle Antwort. Ich habe Ihre Lösung bereits getestet, sobald ich sie ausführe (ohne Doppelklick). Der Cursor blinkt immer noch nicht in Zeile 0 Spalte 0, aber ich denke, es ist in Ordnung für den Moment. Mein Ziel ist die Entwicklung einer neuen Software wie POS-Software, die die Kassiererin im Supermarkt benutzt. Ihr Tisch ist immer bereit für die Eingabe, wenn der Cursor auf Spalte 0 blinkt. Ist das für den Herrn/Frau/Frau Camickr möglich? – Hendra

+0

@Hendra, siehe Bearbeiten. – camickr

0

Ja, der hinzugefügte Code lässt den Cursor auf der ausgewählten Zelle blinken und macht ihn zur Eingabe bereit.

Vielen Dank Camickr.

Ich habe den ausführbaren Code unten für den Fall, dass jemand den gleichen Fall treffen kann.

importieren java.awt.Component;

importieren java.awt.EventQueue;

importieren javax.swing.JFrame;

importieren javax.swing.JPanel;

importieren javax.swing.JScrollPane;

importieren javax.swing.border.EmptyBorder;

importieren javax.swing.table.AbstractTableModel;

importieren javax.swing.JLabel;

importieren java.awt.Font;

importieren javax.swing.SwingConstants;

importieren javax.swing.SwingUtilities;

importieren Sie javax.swing.JTabelle;

public class Test erstreckt JFrame {

public static void main(String[] args) { 
      EventQueue.invokeLater(new Runnable() { 
        public void run() { 
          try { 
           test frame = new test(); 
           frame.setVisible(true); 
           frame.setLocationRelativeTo(null); //make frame center of screen     
          } catch (Exception e) { 
           e.printStackTrace(); 
          } 
        } 
      }); 
    } 


    public test() { 
      //create Jpanel 
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      setBounds(10, 10, 1300, 700); 
      JPanel contentPane = new JPanel(); 
      contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
      setContentPane(contentPane); 
      contentPane.setLayout(null); 
      //create label TOTAL 
      JLabel lblTotal = new JLabel("TOTAL : Rp."); 
      lblTotal.setFont(new Font("Wide Latin", Font.PLAIN, 30)); 
      lblTotal.setBounds(33, 25, 312, 31); 
      contentPane.add(lblTotal); 
      //create label Total Amount 
      JLabel lblNewLabel = new JLabel("123,456,789"); 
      lblNewLabel.setHorizontalAlignment(SwingConstants.RIGHT); 
      lblNewLabel.setFont(new Font("Wide Latin", Font.PLAIN, 60)); 
      lblNewLabel.setBounds(571, 6, 659, 61); 
      contentPane.add(lblNewLabel); 
      //create jtable in scrollpane 
      JTable table = new JTable(new MyTableModel());     
      JScrollPane sp=new JScrollPane(table); 
      sp.setBounds(20,76,1240,572); 
      contentPane.add(sp); 
      //make cursor blinking on selected cell 
      SwingUtilities.invokeLater(new Runnable(){ 
        public void run() { 
          table.changeSelection(0, 0, false, false); 
          if (table.editCellAt(0, 0)){ 
           Component editor = table.getEditorComponent(); 
           editor.requestFocusInWindow(); 
           //((JTextComponent)editor).selectAll(); 
          } 
        } 
      }); 

    } 

//tablemodel 
class MyTableModel extends AbstractTableModel { 
     private String[] columnNames = {"PLU", "NAME", "UOM", "QTY", "PRICE","AMOUNT"}; 
     private Object[][] data = {{"", "", "", new Double(0), new Integer(0), new Integer(0)}};  
     public int getColumnCount() {return columnNames.length;} 
     public int getRowCount() {return data.length;} 

// public String getColumnName (int col) {return column [Spalte];} public Object getValueAt (int row, int col) {return Daten [row ] [col];} // automatische Formatierungstabelle: string = linke Ausrichtung, numerisch = Ausrichtung rechts, Kontrollkästchen = Kontrollkästchen nicht wahr/falsch public Klasse getColumnClass (int c) {return getValueAt (0, c) .getClass ();} // Tabelle nur für erste Spalte editierbar machen
public boolean isCellEditable (int Zeile, int Spalte) {if (col == 0) {return true;} else {return false;}} // make table kann den Wert ändern
public void setValueAt (Objektwert, int row, int col) { Daten [Zeile] [col] = Wert; fireTableCellUpdated (Zeile, Spalte); } }

}