Mr.*_*ool 2 java swing jtable selectionmodel actionlistener
我有一个jtable与listselectionlistener我可以动态添加新行到我的表,当我选择行所选行内容将出现在文本框中我能够编辑和删除数据,为我的应用程序我存储表将数据导入xml文件,当我添加新行时,将成功添加到表中.但当我选择一行并更新意味着表没有得到更新(这里我称之为加载表()).(但更新的值在xml文件中正确更改)这是我创建表的示例代码*
ListSelectionModel selectionModel;
JTable table1;
model = new DefaultTableModel();
table = new JTable(model); table.setRowHeight(20);
selectionModel = table.getSelectionModel();
selectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
selectionModel.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
stxtBox.setText("");
ptxtBox.setText("");
ntxtBox.setText("");
if (!e.getValueIsAdjusting()) {
model1 = table.getSelectionModel();
int lead = model1.getLeadSelectionIndex();
int columns = table.getColumnCount();
String sip = "";
String sport = "";
String snoq = "";
for (int col = 0; col < columns; col++) {
Object o = table.getValueAt(lead, col);
if (col == 0) {
sip += o.toString();
stxtBox.setText(sip);
selectedip = sip;
} else if (col == 1) {
sport += o.toString();
ptxtBox.setText(sport);
selectedport = sport;
} else {
snoq += o.toString();
ntxtBox.setText(snoq);
}
selectedreq = snoq;
}
}table.clearSelection();
}
});
Run Code Online (Sandbox Code Playgroud)
我像这样加载表格内容
int rowCount=0;
File file = new File("serverconfig.xml");
if (file.exists())
{
System.out.print("in load");
int e = table.getRowCount();
if(e> 0)
{
while (table.getRowCount() > 0) {
((DefaultTableModel) table.getModel()).removeRow(0);
}
}
//here i will load table content from my xml file (that's working fine)
Run Code Online (Sandbox Code Playgroud)
问题是,当我更新我的表内容时,我会调用loadtable()函数,我会得到这个错误
java.lang.ArrayIndexOutOfBoundsException: 1 >= 1
at java.util.Vector.elementAt(Unknown Source)
at javax.swing.table.DefaultTableModel.getValueAt(Unknown Source)
at javax.swing.JTable.getValueAt(Unknown Source)
at Testsample$18.valueChanged(Testsample.java:1810)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.insertIndexInterval(Unknown Source)
at javax.swing.JTable.tableRowsInserted(Unknown Source)
at javax.swing.JTable.tableChanged(Unknown Source)
at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)
at javax.swing.table.AbstractTableModel.fireTableRowsInserted(Unknown Source)
at javax.swing.table.DefaultTableModel.insertRow(Unknown Source)
at javax.swing.table.DefaultTableModel.addRow(Unknown Source)
at javax.swing.table.DefaultTableModel.addRow(Unknown Source)
at Testsample.loadtable(Testsample.java:577)
at Testsample$10.actionPerformed(Testsample.java:1551)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
旧故事:如果有达到目标的高级api,永远不要使用较低级别的api.或许是一个相关的故事:一遍又一遍地阅读api文档:-)
对于DefaultTableModel,删除所有行的高级API是:
model.setRowCount(0);
Run Code Online (Sandbox Code Playgroud)
编辑
看看你的堆栈跟踪,错误不是由删除引起的,而是通过访问新添加的行..我的(随机,没有看到更多或你的代码:-)猜测将是rowIndex leadin
Object o = table.getValueAt(lead, col);
Run Code Online (Sandbox Code Playgroud)
你必须检查它是否有效,可能是否定的(无引导)或者仍然是旧的(添加前的索引)请注意,选择状态会因在tableModel中添加/删除数据而更新/更新交互)这里的重要规则是确保在访问客户端代码中的任何状态之前模型更改后更新表的内部.您可以通过将其包装在invokeLater中来实现:
void updateTextBox() {
if (selectionModel.getLeadSelectionIndex() >= table.getRowCount() ||
selectionModel.getLeadSelectionIndex() < 0) return;
.... // update text panel here
}
public void valueChanged(...) {
if (e.getValueIsAdjusting()) return;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
updateTextBox();
}
}));
}
Run Code Online (Sandbox Code Playgroud)
例如
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.table.*;
public class RemoveAddRows extends JFrame {
private static final long serialVersionUID = 1L;
private Object[] columnNames = {"Type", "Company", "Shares", "Price"};
private Object[][] data = {
{"Buy", "IBM", new Integer(1000), new Double(80.50)},
{"Sell", "MicroSoft", new Integer(2000), new Double(6.25)},
{"Sell", "Apple", new Integer(3000), new Double(7.35)},
{"Buy", "Nortel", new Integer(4000), new Double(20.00)}
};
private JTable table;
private DefaultTableModel model;
public RemoveAddRows() {
model = new DefaultTableModel(data, columnNames) {
private static final long serialVersionUID = 1L;
@Override
public Class getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
};
table = new JTable(model) {
private static final long serialVersionUID = 1L;
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component c = super.prepareRenderer(renderer, row, column);
int firstRow = 0;
int lastRow = table.getRowCount() - 1;
int width = 0;
if (row == lastRow) {
((JComponent) c).setBackground(Color.red);
} else if (row == firstRow) {
((JComponent) c).setBackground(Color.blue);
} else {
((JComponent) c).setBackground(table.getBackground());
}
/*if (!isRowSelected(row)) {
String type = (String) getModel().getValueAt(row, 0);
c.setBackground("Buy".equals(type) ? Color.GREEN : Color.YELLOW);
}
if (isRowSelected(row) && isColumnSelected(column)) {
((JComponent) c).setBorder(new LineBorder(Color.red));
}*/
return c;
}
};
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane = new JScrollPane(table);
add(scrollPane);
JButton button1 = new JButton("Remove all rows");
button1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if (model.getRowCount() > 0) {
for (int i = model.getRowCount() - 1; i > -1; i--) {
model.removeRow(i);
}
}
System.out.println("model.getRowCount() --->" + model.getRowCount());
}
});
JButton button2 = new JButton("Add new rows");
button2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
Object[] data0 = {"Buy", "IBM", new Integer(1000), new Double(80.50)};
model.addRow(data0);
Object[] data1 = {"Sell", "MicroSoft", new Integer(2000), new Double(6.25)};
model.addRow(data1);
Object[] data2 = {"Sell", "Apple", new Integer(3000), new Double(7.35)};
model.addRow(data2);
Object[] data3 = {"Buy", "Nortel", new Integer(4000), new Double(20.00)};
model.addRow(data3);
System.out.println("model.getRowCount() --->" + model.getRowCount());
}
});
JPanel southPanel = new JPanel();
southPanel.add(button1);
southPanel.add(button2);
add(southPanel, BorderLayout.SOUTH);
}
public static void main(String[] args) {
RemoveAddRows frame = new RemoveAddRows();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19166 次 |
| 最近记录: |