私は仕事のためにプロジェクトを進めていますが、私は珍しい問題に遭遇しました。私は、ユーザーがデータを入力できるJTableを持っています。私の実際のコードでは、ユーザーがいくつかのGUIを記入できるようにする行追加ボタンがあり、その情報が行を生成します。クローン作成後のJTableセルの編集
この重要なもう1つの機能は、行をクローンするボタンです。ユーザーが1つのセルで新しい行を追加するだけであれば、ボタンを使用してセルをクローンすることができるので、行を追加するプロセスは非常に時間がかかることがあります(記入するフィールドが多数あります)。
このクローンボタンは期待どおり機能しますが、かなり奇妙な問題があります。行がクローン化されると、クローンされた細胞の内容を変更しようとすると予期しない結果が生じることに気付きました。たとえば、セルの内容を「Ryan」に変更すると、他のセルも突然変更されることがあります。クリックしたセルをクリックしても、それをクリックしたセルは変更されます。私はこの問題がクローンメソッドに関連していると確信しています。私は実際には修正することを考えていません。
あなた自身のためにそれをテキストと私が話しているかを見ることができますので、私は検証可能なプログラムを作成しました。クローンボタンを数回使用してから、個々のセルの内容を変更して他のセルの結果を確認してください。
私は本当にこれを修正する必要があります。大いに感謝します。
メインクラス
package jtabletest;
public class JTableTestMain
{
public static void main(String args[]){
JTableTest jTest = new JTableTest();
jTest.createGUI();
}
}
のJTableクラス
package jtabletest;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class JTableTest
{
protected static DefaultTableModel dtm = new DefaultTableModel();
public static JTable tbl;
public void createGUI(){
final JFrame frame = new JFrame("JTable Test");
JPanel mainPanel = new JPanel(new BorderLayout());
JPanel panelNorth = new JPanel(new BorderLayout());
JPanel panelSouth = new JPanel(new BorderLayout());
JPanel buttonPanel = new JPanel();
JButton cloneButton = new JButton("Clone");
cloneButton.setPreferredSize(new Dimension(150,40));
buttonPanel.add(cloneButton);
JButton printButton = new JButton("Print");
printButton.setPreferredSize(new Dimension(150,40));
buttonPanel.add(printButton);
tbl = new JTable();
String header[] = new String[]{
"Employee", "Pay-Rate", "Hours Worked"};
dtm.setColumnIdentifiers(header);
tbl.setModel(dtm);
tbl.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
for(int i = 0; i < header.length; i++){
tbl.getColumnModel().getColumn(i).setPreferredWidth(200);
}
dtm.addRow(new Object[]{"Pete","$10.00","40"});
dtm.addRow(new Object[]{"Bob","12.50","42"});
dtm.addRow(new Object[]{"Jamar","$7.25,25"});
cloneButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
int[] selectedRows = tbl.getSelectedRows();
if(selectedRows.length>0){
@SuppressWarnings("rawtypes")
Vector data = dtm.getDataVector();
int insertPoint = selectedRows[selectedRows.length-1]+1;
for(int i = 0; i < selectedRows.length; i++){
@SuppressWarnings("rawtypes")
Vector targetRow = (Vector)data.elementAt(selectedRows[i]);
dtm.insertRow(insertPoint, targetRow);
insertPoint++;
}
dtm.fireTableDataChanged();
}
}
});
printButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
if(null != tbl.getCellEditor()){
tbl.getCellEditor().stopCellEditing();
}
for(int i = 0; i < tbl.getRowCount(); i++){
System.out.println(tbl.getValueAt(i, 0));
System.out.println(tbl.getValueAt(i, 1));
System.out.println(tbl.getValueAt(i, 2));
}
}
});
panelNorth.add(tbl,BorderLayout.NORTH);
panelNorth.setPreferredSize(new Dimension(500,500));
panelSouth.add(buttonPanel,BorderLayout.NORTH);
mainPanel.add(panelNorth,BorderLayout.NORTH);
mainPanel.add(panelSouth,BorderLayout.SOUTH);
frame.add(mainPanel);
frame.setVisible(true);
frame.setSize(1900,600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
私はあなたのテストで検証プログラム#1は、あなたの問題を解決します。根本的な問題は、Vectorへの参照を渡して複数の行に再利用することです。それは同じ根底にあるデータです。 –
このソリューションは完全に機能しました。ご協力いただきありがとうございます。 – jesric1029