【问题标题】:Inserting new data from External class into Jtable将外部类中的新数据插入 Jtable
【发布时间】:2013-01-30 10:39:29
【问题描述】:

我是 Stack Overflow 的新手,正在寻找有关我在大学期间一直在开发的 Java 应用程序的帮助。

我的问题是,如何使用按钮操作侦听器事件将 Jtextfield(在外部类中)中的整数插入 Jtable。

我的代码是:

将 jtextfield 整数插入表格的外部类按钮代码

   package banknew;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;



public class CheckingAccount extends BANKNEW
{

final JButton DepositAmount = new JButton("Deposit");  
final JTextField tAmount = new JTextField();

    public void CheckingAccount() {
        String title = "Checking Account";
        JFrame checkingAccount = new JFrame(title);

        checkingAccount.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        checkingAccount.setSize(400, 200);
        checkingAccount.setLocation(checkingAccount.getHeight() / 2, checkingAccount.getWidth() / 2);

        final JLabel error = new JLabel("");
        checkingAccount.add(error, BorderLayout.SOUTH);
        error.setVisible(true);
        error.setLocation(5, 600);


        JMenuItem file1 = new JMenuItem("Checking Account");
        JMenuItem file2 = new JMenuItem("Checking Accounts");
        JMenuItem file3 = new JMenuItem("Checking Accounts");
        JMenuItem file4 = new JMenuItem("Bank Account");
        JMenuItem file5 = new JMenuItem("Close");



        JMenu filemenu = new JMenu("File");
        filemenu.add(file1);
        filemenu.add(file2);
        filemenu.add(file3);
        filemenu.addSeparator();
        filemenu.add(file4);
        filemenu.addSeparator();
        filemenu.add(file5);

        JMenuBar menubar = new JMenuBar();
        menubar.add(filemenu);
        checkingAccount.setJMenuBar(menubar);
        BorderLayout border = new BorderLayout();
        filemenu.setLayout(border);
        checkingAccount.setVisible(true);





        /**
         * ****************************************
         * Create Second JPanel - Buttons & ComboBox .
 *****************************************
         */
        JPanel abuttons1 = new JPanel();
        checkingAccount.add(abuttons1);
        //abuttons1.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        abuttons1.setBorder(BorderFactory.createTitledBorder(""));

        JButton Withdraw = new JButton("Withdraw");
        JLabel transBankName1 = new JLabel("Account Name:");
        JLabel transAmount = new JLabel("Amount:");


        final JTextField tBankName1 = new JTextField(20);
        final JComboBox AccountName = new JComboBox();
        AccountName.setEditable(false);
        AccountName.setMaximumSize(new java.awt.Dimension(100, 20));
        AccountName.setBorder(javax.swing.BorderFactory.createEtchedBorder());

        transBankName1.setMaximumSize(new java.awt.Dimension(100, 20));
        transAmount.setMaximumSize(new java.awt.Dimension(100, 20));
        tAmount.setMaximumSize(new java.awt.Dimension(100, 20));
        tBankName1.setMaximumSize(new java.awt.Dimension(00, 20));

        abuttons1.setLayout(new GridLayout(5, 1, 5, 5));
        abuttons1.add(transBankName1);
        abuttons1.add(AccountName);
        abuttons1.add(transAmount);
        abuttons1.add(tAmount);

        abuttons1.add(Withdraw);
        abuttons1.add(DepositAmount);
        abuttons1.setLocation(0, 0);
        abuttons1.setSize(300,200);

         DepositAmount.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (table.getSelectedRow() > -1) {
                    // assuming from your code that you want to set the
                    // textfield's value at the table's selected row
                    try {
                        Integer amount = Integer.parseInt(tAmount.getText());
                        table.getModel().setValueAt(amount, table.getSelectedRow(), 4);
                    } catch (NumberFormatException nfe) {
                        // User did not provide a number.
                        // do nothing? show dialog? you name it!
                    }
                }
            }
        });
    }


    }
  • External 类有一个带有文本字段和“存款”按钮的 GUI。
  • 主类有一个带有 5 列 JTable 的 GUI

我想要做的就是拥有一个带有按钮的外部扩展类,然后在按钮上单击将本地文本字段中的数量插入到主 Jtable 中,如带有“abc”表模型的代码所示。

我已经搜索了谷歌和堆栈溢出,但大多数帖子都与 SQL 或数据库链接有关。

如果有人能指出正确的方向,我将不胜感激。

谢谢

编辑 2:复制并粘贴代码并尝试上传主类,复制后告诉我...

【问题讨论】:

  • 尽量遵守 Java 编码约定,尤其是 naming conventions,它使您的代码更易于阅读。
  • 将选择监听器放在桌面上不是要走的路,它是你如何聆听其他人/用户在桌面上所做的更改。在这里,您希望以编程方式对表进行更改。这可以通过 tablemodel abc 来完成。
  • 感谢您的快速回复,extends BANKNEW 是否也错了?我需要在课堂上实现一​​个 TableModel 吗?从外部类插入表的最佳方法是什么?
  • 你不需要这样做,你可以使用table.getModel()获取它的模型。
  • DepositAmount.addActionListener(new ActionListener() { int row; public void actionPerformed(ActionEvent e) { TableModel abc1 = table.getModel(); row = table.getSelectedRow(); abc1.setValueAt(123 , 行,4); } }); *** 这个怎么样,它在线程“AWT-EventQueue-0”中抛出一个错误消息异常 java.lang.ArrayIndexOutOfBoundsException: -1 及其抛出它的 abc1.setValueAt 命令?

标签: java swing jtable


【解决方案1】:

我有点不确定您的课程是否更全球化。 但如果 CheckingAccount 应该写入表,则需要在其构造函数中提供对表的引用。

public class CheckingAccount {
    final JButton depositAmount = new JButton("Deposit");  
    final JTextField tAmount = new JTextField();

    //Provide the JTable to the CheckingAccount when you construct it!
    public CheckingAccount(final JTable table) {
        depositAmountButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (table.getSelectedRow() > -1) {
                    // assuming from your code that you want to set the
                    // textfield's value at the table's selected row
                    try {
                        Integer amount = Integer.parseInt(textField.getText());
                        table.getModel().setValueAt(amount, table.getSelectedRow(), 4);
                    } catch (NumberFormatException nfe) {
                        // User did not provide a number.
                        // do nothing? show dialog? you name it!
                    }
                }
            }
        });
    }
}

要了解有关如何使用 Swing 的更多信息,请查看Oracle tutorials

【讨论】:

  • 该代码正是我想要的,并且编译良好,没有错误消息。然而,主类中的表没有插入实际值,换句话说,它没有更新到表中?表字段存储在 Main 类中,而不是 Checking Account 类中。这可能是问题吗?
  • 您在按下按钮之前选择了一行吗?
  • 是的,该行被选中,代码应该可以工作,没有语法错误等
  • 我不小心把 void 关键字留在了构造函数前面。它必须去! (我更新了答案)。现在已经测试过了,在这里工作。
  • 谢谢,但它仍然不起作用,我把我的整个代码给你看,它很乱,但如果你能解决问题,我会很惊讶。也试试吧……
【解决方案2】:

谢谢你,你的代码确实给了我们一个方向,它确实是最有价值的。

我已将此代码用作组件。关键在:

final static

表格组件和按钮组件

重要提示:单击添加按钮时,我已成功添加新行。但添加不是从 1/0 开始,而是从第 2 行开始

import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class AmendingTable {
    final static JButton        addData         = new JButton("Add");

    static String a;
    static String b;
                                                                //Don't introduce row here otherwise it will add 1 empty row at start
    final static DefaultTableModel model = new DefaultTableModel(null, new String [] {"Products", "Prices" });
    final static JTable table = new JTable(model);

    public static Component table() {
        model.setRowCount(0);
        table.setRowHeight(30);
        return table;
    }
    //ORGINAL
    public static Component addingRowse(final JTable table) {   
        addData.addActionListener(new ActionListener() {
            @Override
                public void actionPerformed(ActionEvent e) {


                            a = String.valueOf(TextFields.jtfProdName.getText());
                            b = String.valueOf(TextFields.jtfProdPrice.getText());

                            String [] row = {a, b};             

                            model.addRow(row);

                }
        });

        return addData;
    }
}

我如何在我的 Java 面板中调用它们。此处调用的表

public static Component orderLister() {
    jpOrderLister = new JPanel();

    jpOrderLister.setBounds(5, 105, 450, 300);
    jpOrderLister.setBackground(Color.GREEN);
    jpOrderLister.setLayout(new GridLayout(1,1,0,0)); //Border : Top / Left / Bottom / Right / Colour
    jpOrderLister.setBorder(BorderFactory.createMatteBorder(1, 5, 1, 5, Color.LIGHT_GRAY));

    //
    JScrollPane sPane = new JScrollPane();
    sPane.setPreferredSize(new Dimension(200, 150));
    sPane.getViewport().add(AmendingTable.table);
    sPane.setBackground(Color.white);

    jpOrderLister.add(sPane);

    return jpOrderLister;
}

在 Java 面板中这样调用按钮

public static Component buttons() {
    jpButtons = new JPanel();
    jpButtons.setBounds(200, 410, 100, 50);
    jpButtons.setLayout(new GridLayout(1,1,0,0));
    jpButtons.setBackground(Color.GRAY);

    jpButtons.add(AmendingTable.addingRowse(AddingRowsToJTable.table));

    return jpButtons;
}

【讨论】:

  • 请从这里删除 Dropbox 链接并重新添加代码。如果您遇到问题,我(或其他人)可以帮助您格式化。格式化在这里确实有效!
  • 我知道它有效,但无论我说多少它的代码 {} 它都会变回红色并且不会让我发布答案,这是我发布文件的唯一原因
  • 我已将文件添加到 Dropbox 文本文件中。
猜你喜欢
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
  • 2015-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-07
  • 1970-01-01
相关资源
最近更新 更多