2017-11-23 15 views
0

これに似たキーバインディングトピック(JTable Key Bindings)が見つかりました。私はそのキーバインディングがエディタではなくテーブルにバインドされていることを知りました。JTableエディタでのキーバインド

私の目標はVK-ENTERで終わるエディタ上の入力です。アクションpindah(新しい行を追加し、新しい行にカーソルを点滅させる)を実行します。申し訳ありませんが、私はその例から学ぶことができませんでした。

方法はありますか?

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(583, 19, 659, 61); 
    contentPane.add(lblNewLabel); 
    //create jtable in scrollpane 
    String[] columnNames = {"PLU", "NAME", "UOM", "QTY", "PRICE","AMOUNT"}; 
     Object[][] data = {{"", "", "", "", "", ""}}; 
     DefaultTableModel model = new DefaultTableModel(data, columnNames); 
    JTable table = new JTable(model);     
    table.setFont(new Font("Tahoma", Font.PLAIN, 20)); 
    table.setRowHeight(25); 
    JScrollPane sp=new JScrollPane(table);    
    sp.setBounds(25,100,1240,556); 
    contentPane.add(sp); 
    //set column width 
    TableColumnModel columnModel = table.getColumnModel(); 
    short a[] = {150,540,50,150,150,200}; 
    for(byte i=0;i<6;i++) { columnModel.getColumn(i).setPreferredWidth(a[i]); } 
    //render column format left alignment 
    for(byte i=0;i<3;i++) {table.getColumnModel().getColumn(i).setCellRenderer(new TextTableCellRenderer());} 
    //render column format ###,##0 right alignment 
    for(byte i=3;i<6;i++) {table.getColumnModel().getColumn(i).setCellRenderer(new NumberTableCellRenderer());} 
    //make cursor blinking on selected cell + select all cell value 
    SwingUtilities.invokeLater(new Runnable() 
    { 
     public void run() 
     { 
      table.changeSelection(0, 0, false, false); 
      if (table.editCellAt(0, 0)) 
      { 
       Component editor = table.getEditorComponent(); 
       editor.setFont(new Font("Tahoma", Font.PLAIN, 20)); 
       editor.requestFocusInWindow(); 
       ((JTextComponent)editor).selectAll(); //select all cell value     

       //key binding 
       Action pindah = new AbstractAction() 
       { 
        @Override 
        public void actionPerformed(ActionEvent e) 
        { 
         //add row at last row 
         model.addRow(data); 
         //i want to add new blank row but somehow there is value on column 0, so I have to set it blank. If you have a solution on this, you're very welcome 
         model.setValueAt("", model.getRowCount()-1, 0); 
         //make cursor blinking on selected cell + select all cell value 
          SwingUtilities.invokeLater(new Runnable() 
          { 
           public void run() 
           { 
            table.changeSelection(0, 0, false, false); 
            if (table.editCellAt(model.getRowCount()-1, 0)) 
            { 
             Component editor = table.getEditorComponent(); 
             editor.setFont(new Font("Tahoma", Font.PLAIN, 20)); 
             editor.requestFocusInWindow(); 
             ((JTextComponent)editor).selectAll(); //select all cell value     
            } 
           } 
          });    
        } 
       }; 
       ((JComponent) editor).getInputMap().put(KeyStroke.getKeyStroke((char) KeyEvent.VK_ENTER), "pindah"); 
       ((JComponent) editor).getRootPane().getActionMap().put("pindah", pindah); 


      } 
     } 
    });    

} 

// render column format left alignment 
public class TextTableCellRenderer extends DefaultTableCellRenderer 
    {public TextTableCellRenderer() {{setHorizontalAlignment(JLabel.LEFT);}} } 
// render column format to ###,##0 
public class NumberTableCellRenderer extends DefaultTableCellRenderer 
{   
    public NumberTableCellRenderer() {setHorizontalAlignment(JLabel.RIGHT);} 
     @Override 
     public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
     { 
       if (value instanceof Number) {value = NumberFormat.getNumberInstance().format(value);} 
       return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
     } 
} 
} 
+0

1)コードスニペット、HTML/XMLや入出力などの構造化文書には、コードの書式設定を使用してください。これを行うには、テキストを選択し、メッセージの投稿/編集フォームの上部にある「{}」ボタンをクリックします。 2)Java GUIは、異なるロケールで異なるPLAFを使用する異なるOS、画面サイズ、画面解像度などで動作する必要があります。したがって、ピクセルの完全なレイアウトには役立ちません。代わりに、レイアウトマネージャや[それらの組み合わせ](http://stackoverflow.com/a/5630271/418556)と[空白](http://stackoverflow.com/a/17874718/)のレイアウトパディングとボーダーを使用してください。 418556)。 –

+0

私はEclipse IDEを使用しています、その形式はEclipseでうまく見えますが、私がここに貼り付けると、Eclipseのものと同じではありません。そのフォーマットは奇妙になります。私は次の記事でこれよりもうまくいくことを期待して作業します。あなたの入力Andrewに感謝します。 – Hendra

+0

それは奇妙に見える理由は、単にコードの書式設定を使用していないことです!私は**私のコメントでどのように**を説明し、**は編集でそれを使用しました**。 –

答えて

1

ない答えが、あなたのコードについて、いくつかのコメント:

は、ここに私の(Eclipseが自動的にそれを提案しますと輸入を除く)のコードです。

まず、Event Dispatch Thread(EDT)について理解する必要があります。 GUIコンポーネントの更新は、EDT上で行う必要があります。

通常、EDTにGUIを作成するので、SwingUtilities.invokeLater()コードをネストする必要はありません。

最初のセルを編集可能にしてカーソルを点滅させるために、invokeLater(...)を追加する必要があった理由は、フレームが表示されていない場合、コンポーネントにフォーカスを設定できないためです。したがって、invokeLater(...)は、EDTの最後にコードを追加できるので、main()メソッドのsetVsible(...)ステートメントの後に実行されます。

したがって、キーバインディングを使用する場合は、すべてのキーバインドをFposクラスのコンストラクタに設定するだけで済みます。

しかし、私はこの現在の要件の適切な解決策を知りません。

現在、セルエディタとして使用されるJTextFieldにActionListenerが追加されています。 Enterキーを押すと、リスナーが呼び出され、テーブルのstop cell editing logicが呼び出されます。つまり、エディタの値がTableModelに追加され、セルエディタがテーブルから削除されます。

このデフォルトの動作が発生する必要があるため、キーバインディングをエディタに追加するだけでは不便です。

カスタムセルエディタを作成することができますね。次に、ActionListenerで追加の要件を追加できます。

+0

私は、デフォルトのセルエディタがキーバインディングの直前にENTERの後にテーブルから自動的に削除されるのを見ています。カスタムセルエディタ?JTable上にホバーする新しいJTextFieldを作成して、常にフォーカスしていますか? JTableの行と列のサイズと同じサイズを設定します。この場合、どのイベントハンドラを使うべきですか?このホバリングJTextFieldのKeyListenerまたはKeyBinding?ありがとうございました。 – Hendra

+0

カスタムテーブルセルエディタの例が見つかりました。 http://www.java2s.com/Code/Java/Swing-JFC/CreatingaCustomTableCellEditorinaJTableComponent.htm。この場合、JTextFieldのサイズを変更する必要はありません。この場合、KeyListenerまたはKeyBindingを使用する方が良いでしょうか?私はまだキーストーリーやキーバインドの違いをよく理解していませんが、キーバインディングはコードで読みやすく、その構造がちょっとあります。 – Hendra

+0

私は適切な解決策がわかりません。私の提案はActionListenerにコードを追加することでした。テキストフィールドはすでにキーバインディングを使用してEnterキーを処理しています。 – camickr

関連する問題