これに似たキーバインディングトピック(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);
}
}
}
1)コードスニペット、HTML/XMLや入出力などの構造化文書には、コードの書式設定を使用してください。これを行うには、テキストを選択し、メッセージの投稿/編集フォームの上部にある「{}」ボタンをクリックします。 2)Java GUIは、異なるロケールで異なるPLAFを使用する異なるOS、画面サイズ、画面解像度などで動作する必要があります。したがって、ピクセルの完全なレイアウトには役立ちません。代わりに、レイアウトマネージャや[それらの組み合わせ](http://stackoverflow.com/a/5630271/418556)と[空白](http://stackoverflow.com/a/17874718/)のレイアウトパディングとボーダーを使用してください。 418556)。 –
私はEclipse IDEを使用しています、その形式はEclipseでうまく見えますが、私がここに貼り付けると、Eclipseのものと同じではありません。そのフォーマットは奇妙になります。私は次の記事でこれよりもうまくいくことを期待して作業します。あなたの入力Andrewに感謝します。 – Hendra
それは奇妙に見える理由は、単にコードの書式設定を使用していないことです!私は**私のコメントでどのように**を説明し、**は編集でそれを使用しました**。 –