如何在此表上执行添加操作? [英] How addition operation can be performed on this table?

查看:84
本文介绍了如何在此表上执行添加操作?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JComponent;
import javax.swing.SwingUtilities;
import net.java.dev.designgridlayout.DesignGridLayout;
import java.io.*;
import net.java.dev.designgridlayout.Tag;
import javax.swing.JButton;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.*;
import java.sql.*;
import javax.swing.table.TableColumn;

class table1 {
    JFrame JF;
    Container C;
    JPanel JP;
    JLabel creditLabel;
    JComboBox credit;
    String[] Credit = { "Vasan Phalke", "Pansare", "Anil Kg", "Suresh",
            "Total Credit", "" };
    String[] Names = { "Name", "Qty", "Rate/ Kg", "Total Amt." };
    JTable table;
    DefaultTableModel model;
    JScrollPane scrollPane;

    public table1() {
        JF = new JFrame();
        JP = new JPanel();
        C = JF.getContentPane();
        C.setLayout(new BorderLayout());
        JF.pack();
        JF.setLocationRelativeTo(null);
        JF.setVisible(true);

        DesignGridLayout layout = new DesignGridLayout(JP);

        creditLabel = new JLabel("Credit");
        credit = new JComboBox<String>(Credit);
        model = new DefaultTableModel(Names, 6) {
            @Override
            public Class<?> getColumnClass(int columnIndex) {
                switch (columnIndex) {
                case 0:
                    return String.class;
                case 1:
                    return Integer.class;
                case 2:
                case 3:
                    return Double.class;
                }
                return super.getColumnClass(columnIndex);
            }

            public Object getValueAt(int row, int column) {

                if (column == 3) {
                    Integer i = (Integer) getValueAt(row, 1);
                    Double d = (Double) getValueAt(row, 2);
                    if (i != null && d != null) {
                        return i * d;
                    } else {
                        return 0 * 0;
                    }
                }
                return super.getValueAt(row, column);
            }

            public boolean isCellEditable(int arg0, int arg1) {
                return true;
            }

            public void setValueAt(Object aValue, int row, int column) {
                super.setValueAt(aValue, row, column);
                fireTableCellUpdated(row, 3);
            }
        };
        table = new JTable(model);
        {
            TableColumn nameColumn = table.getColumnModel().getColumn(0);
            nameColumn.setCellEditor(new DefaultCellEditor(credit));
        }

        scrollPane = new JScrollPane(table);

        layout.row().grid(creditLabel);
        layout.emptyRow();
        layout.row().grid().add(scrollPane);

        C.add(JP);

    }

    public static void main(String args[]) {
        new table1();
    }
}

我想要Total Amt的总和。列出现在单元格上(5,4)。我尝试了一些代码,但是失败了,请在下面添加显示附加图像的代码。从过去的5个小时开始,我被困在这桌子里。在此先感谢。

I want the total of Total Amt. column to appear on the cell (5,4). I tried some code, which fails, the code which shows the image attached is added below, please. I am stuck at this table thing from past 5 hrs. Thanks in advance.

推荐答案

您的示例的简化变体,其中包含此方法如下所示。请注意以下几点:

A simplified variation of your example that incorporates this approach is shown below. Note several important points:


  • 虽然 JTable 电子表格, 可以动态更新单元格,以帮助理解。使用 TableModelListener 更新相关的视图组件。

  • While a JTable is not a spreadsheet, it is possible to update cells dynamically as an aid to understanding. Use a TableModelListener to update related view components.

TableModel 应该为至少可能的单元数量; fireTableDataChanged()用于在这个固定尺寸的小型号上使用。

The TableModel should fire events for the least number of cells possible; fireTableDataChanged() is used for expedience on this small, fixed-size model.

始终 pack()封闭的窗口和make setVisible() 最后

Always pack() the enclosing Window and make setVisible() last.

应该在上构建和操作的Swing GUI对象: //docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html\"rel =nofollow noreferrer>事件派遣线程

Swing GUI objects should be constructed and manipulated only on the event dispatch thread.

使用通用编码约定。

代码经测试:

import java.awt.EventQueue;
import javax.swing.*;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;

public class Table1 {

    JFrame frame;
    JComboBox credit;
    String[] rowNames = {
        "Vasan Phalke", "Pansare", "Anil Kg", "Suresh", "Total Credit", ""};
    String[] colNames = {"Name", "Qty", "Rate/ Kg", "Total Amt."};
    JTable table;
    DefaultTableModel model;
    JScrollPane scrollPane;

    public Table1() {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        credit = new JComboBox<>(rowNames);
        model = new DefaultTableModel(colNames, 6) {
            @Override
            public Class<?> getColumnClass(int columnIndex) {
                switch (columnIndex) {
                    case 0:
                        return String.class;
                    case 1:
                        return Integer.class;
                    case 2:
                        return Double.class;
                    case 3:
                        return Double.class;
                }
                return super.getColumnClass(columnIndex);
            }

            @Override
            public Object getValueAt(int row, int col) {
                if (col == 3 & row == 5) {
                    double sum = 0;
                    for (int i = 0; i < 5; i++) {
                        sum += ((Double) getValueAt(i, 3)).doubleValue();
                    }
                    return sum;
                }
                if (col == 3 & row != 5) {
                    Integer i = (Integer) getValueAt(row, 1);
                    Double d = (Double) getValueAt(row, 2);
                    if (i != null && d != null) {
                        return i * d;
                    } else {
                        return 0d;
                    }
                }
                return super.getValueAt(row, col);
            }

            @Override
            public void setValueAt(Object aValue, int row, int col) {
                super.setValueAt(aValue, row, col);
                fireTableDataChanged();
            }

            @Override
            public boolean isCellEditable(int row, int col) {
                return col != 3;
            }
        };
        table = new JTable(model);
        TableColumn nameColumn = table.getColumnModel().getColumn(0);
        nameColumn.setCellEditor(new DefaultCellEditor(credit));
        scrollPane = new JScrollPane(table);
        frame.add(new JScrollPane(table));
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Table1();
            }
        });
    }
}

这篇关于如何在此表上执行添加操作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆