Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将值设置为特定列时JTable Java错误堆栈溢出_Java_Swing_Jtable_Stack Overflow - Fatal编程技术网

将值设置为特定列时JTable Java错误堆栈溢出

将值设置为特定列时JTable Java错误堆栈溢出,java,swing,jtable,stack-overflow,Java,Swing,Jtable,Stack Overflow,下面是我的代码。我已经创建了一个包含4列和3行的Jtable。 并添加表模型侦听器,在表更改侦听器中,当我在特定列中设置值时,堆栈溢出错误即将出现 **error is Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError at java.nio.Buffer.<init>(Buffer.java:189) at java.nio.CharBuffer.<init>(Char

下面是我的代码。我已经创建了一个包含4列和3行的Jtable。 并添加表模型侦听器,在表更改侦听器中,当我在特定列中设置值时,堆栈溢出错误即将出现

**error is Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
    at java.nio.Buffer.<init>(Buffer.java:189)
    at java.nio.CharBuffer.<init>(CharBuffer.java:276)
    at java.nio.HeapCharBuffer.<init>(HeapCharBuffer.java:70)
    at java.nio.CharBuffer.wrap(CharBuffer.java:369)
    at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:265)**
JTable#setValueAt
将调用
TableModel#setValueAt
,这将触发
TableChanged
事件,这就是为什么它会导致
StackOverflowException
(它陷入无限循环)


更好的解决方案是覆盖
TableModel#setValueAt
,如果列
0
1
2
被更新,也要计算列
3
的值,但别忘了触发
cellUpdated
事件,我同意你的看法,它陷入了无限循环,但解决方案部分你能解释一下吗。
import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;

public class TableModelListenerDemo {

    public static void main(String args[]) {

        final Object rowData[][] = {{"1", "one", "I",null}, {"2", "two", "II",null}, {"3", "three", "III",null}};
        final String columnNames[] = {"#", "English", "Roman", "Test"};

        final JTable table = new JTable(rowData, columnNames);
        JScrollPane scrollPane = new JScrollPane(table);
        table.getModel().addTableModelListener(new TableModelListener() {

            @Override
            public void tableChanged(TableModelEvent e) {
                try {
                    System.out.println(e);
                    int row = table.getSelectedRow();
                    Object QTY = table.getValueAt(row, 0);
                    Object UPrice = table.getValueAt(row, 1);
                    Object Three = table.getValueAt(row, 2);
                    table.setValueAt(Three, row, 3);
                }catch(Exception ex){

                }

            }
        });

        table.setValueAt("", 0, 0);
        JFrame frame = new JFrame("Resizing Table");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.add(scrollPane, BorderLayout.CENTER);

        frame.setSize(300, 150);
        frame.setVisible(true);

    }
}