Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.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
两列的java Swing求和_Java_Swing_Jtable - Fatal编程技术网

两列的java Swing求和

两列的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

我用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.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);
    }
};