两列的java Swing求和
我用Swing做了一个GUI,它扩展了Jframe,我的jtable中有6列,我读取数据 从文本文件中,在第4列和第5列中有值100和200,因此我希望当用户在第4列中编辑并放置160而不是100时,第5列会自动更改为140或user 第5列的编辑是280,而不是200。第4列自动更改为20。这是我的代码两列的java Swing求和,java,swing,jtable,Java,Swing,Jtable,我用Swing做了一个GUI,它扩展了Jframe,我的jtable中有6列,我读取数据 从文本文件中,在第4列和第5列中有值100和200,因此我希望当用户在第4列中编辑并放置160而不是100时,第5列会自动更改为140或user 第5列的编辑是280,而不是200。第4列自动更改为20。这是我的代码 import java.awt.*; import java.awt.event.*; import java.io.*; import java.util.*; import javax.s
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
public class Cs extends JFrame
{
private JTable table;
private DefaultTableModel model;
public Cs()
{
String aLine ;
Vector columnNames = new Vector();
Vector data = new Vector();
try
{
FileInputStream fin = new FileInputStream("cs.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fin));
StringTokenizer st1 = new StringTokenizer(br.readLine(), " ");
while( st1.hasMoreTokens() )
{
columnNames.addElement(st1.nextToken());
}
while ((aLine = br.readLine()) != null)
{
StringTokenizer st2 = new StringTokenizer(aLine, " ");
Vector row = new Vector();
while(st2.hasMoreTokens())
{
row.addElement(st2.nextToken());
}
data.addElement( row );
}
br.close();
}
catch (Exception e)
{
e.printStackTrace();
}
model = new DefaultTableModel(data, columnNames);
table = new JTable(model);
JScrollPane scrollPane = new JScrollPane( table );
getContentPane().add( scrollPane );
}
public static void main(String[] args)
{
Cs frame = new Cs();
frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
frame.pack();
frame.setVisible(true);
}
}
覆盖TableModel的setValueAt,并根据更改更新其他列。这是一个例子。希望这对你有帮助
JFrame frame = new JFrame("Summation of 2 columns");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Object rows[][] = { { 100, 200 } };
String columns[] = { "Column 1", "Column 2" };
JTable table = new JTable(new DefaultTableModel(rows, columns) {
private static final long serialVersionUID = 1L;
public Class<? extends Object> getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
@Override
public void setValueAt(Object object, int row, int column) {
int changedValue = ((Integer) object).intValue();
if (column == 0) {
super.setValueAt(300 - changedValue, row, column + 1);
} else if (column == 1) {
super.setValueAt(300 - changedValue, row, column - 1);
}
super.setValueAt(object, row, column);
}
});
JScrollPane pane = new JScrollPane(table);
frame.add(pane, BorderLayout.CENTER);
frame.setSize(200, 150);
frame.setVisible(true);
到
model = new DefaultTableModel(rows, columns) {
private static final long serialVersionUID = 1L;
public Class<? extends Object> getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
@Override
public void setValueAt(Object object, int row, int column) {
int changedValue = ((Integer) object).intValue();
if (column == 2) {
super.setValueAt(300 - changedValue, row, column + 1);
} else if (column == 3) {
super.setValueAt(300 - changedValue, row, column - 1);
}
super.setValueAt(object, row, column);
}
};
在TableModel的自定义实现中实现此规则。每次setValueAt更改一列时,也要更改另一列。所以…去做吧。我看这里没有问题。谢谢。但我不明白如何在我的代码中实现它。上面是我的代码和文本文件,我从中将数据读入JTable。上面的代码从文件中读取数据,并在此基础上构造表模型。只需覆盖表的setValueAt,并在其中包含业务逻辑。如果第3列或第3列发生更改,则更新更改后的值,如该列中的X和另一列中的300-X。如果更改的列不是3或4,只需单独设置更改列的值。很抱歉,我是swing新手,我很难理解。因此,请您为我详细说明。更新了答案。我用硬编码300求两列之和。你可以根据需要进行调整。非常感谢@Loganathan Mohanraj你的逻辑对我帮助很大,但我发现在我的代码中很难实现它,因为我有8列,如何定义我要在哪两列中实现此逻辑,而且它是从文本文件中读取数据。我尝试在代码中实现您的代码,但找不到解决方案。我尝试使用其中定义的两列和值,效果很好。但是,当我尝试从文本文件中读取8列和值时,我发现很难找到解决方案懂
model = new DefaultTableModel(rows, columns) {
private static final long serialVersionUID = 1L;
public Class<? extends Object> getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
@Override
public void setValueAt(Object object, int row, int column) {
int changedValue = ((Integer) object).intValue();
if (column == 2) {
super.setValueAt(300 - changedValue, row, column + 1);
} else if (column == 3) {
super.setValueAt(300 - changedValue, row, column - 1);
}
super.setValueAt(object, row, column);
}
};