【问题标题】:java Swing summation of the two columnsjava Swing对两列求和
【发布时间】:2014-08-23 14:59:23
【问题描述】:

我用 Swing 制作了一个扩展 Jframe 的 GUI,我的 jtable 中有 6 列。我读取数据 从文本文件中,在第 4 列和第 5 列中有值 100 和 200,所以我希望当用户在第 4 列中编辑并将 160 而不是 100 第 5 列自动更改为 140 或用户 第 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);
     }

   }

【问题讨论】:

标签: java swing jtable


【解决方案1】:

覆盖 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(data, columnNames);

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);
    }
};

【讨论】:

  • 谢谢。但我不明白如何在我的代码中实现它。上面是我的代码和我将数据读入 JTable 的文本文件。
  • 您上面的代码从文件中读取数据并以此为基础构建表模型。只需为您的表覆盖 setValueAt() 并在其中包含业务逻辑。如果第 3 列或列发生更改,请更新该列中的更改值(Say X)和另一列中的(300 - X)。如果更改的列不是 3 或 4,只需单独设置更改列的值。
  • 对不起,我是新来的摇摆人,我越来越难以理解。所以请您为我详细说明一下。
  • 更新了答案。我为 2 列的总和硬编码了 300。您可以根据需要进行调整。
  • 非常感谢@Loganathan Mohanraj,您的逻辑对我帮助很大,但我发现很难在我的代码中实现它,因为我有 8 列,如何定义我想要的两列实现这个逻辑,而且它正在从文本文件中读取数据。我尝试在我的代码中实现你的代码,但找不到解决方案。我尝试了两列和其中定义的值,它工作正常。但是当我尝试使用从文本文件中读取的 8 列和值,我觉得很难理解。
猜你喜欢
  • 2017-03-11
  • 1970-01-01
  • 1970-01-01
  • 2011-12-16
  • 1970-01-01
  • 2011-10-05
  • 1970-01-01
  • 2014-10-21
  • 2013-01-25
相关资源
最近更新 更多