【问题标题】:Importing text into a JTable is not displaying将文本导入 JTable 未显示
【发布时间】:2023-12-25 13:41:01
【问题描述】:

我创建了一个程序,我可以在其中在 JTextField 中输入数据,并在点击保存按钮时使用 JFileChooser 将数据保存在 .txt 文件中,其中每个 JTextField 都在一个新行中。我还创建了一个按钮,它会弹出一个 JFileChooser 来浏览该文件并填充其相应的单元格。

我是 GUI 新手,我编写的代码不起作用。我尝试了不同的变化,但似乎无法得到它。请有人指出我正确的方向。

输入是

 john
Doe
st. Jude
100

这里是代码

import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.table.DefaultTableModel;

import java.util.Scanner
import java.util.Vector;
import java.awt.event.*;
import java.awt.*;
import java.text.DecimalFormat;
import java.io.*;

//import javax.swing.filechooser;
import javax.swing.filechooser.FileFilter;

public class Charity 
{
@SuppressWarnings("deprecation")
public static void main(String[] args) 
{
    JFrame frame = new JFrame("Learning Team Charity Program");
    Container cp = frame.getContentPane();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    // Charities
    final String[] charityArray = {"St.Jude", "CHOC", "Cancer Research", "AIDs Foundation", "Crohns Foundation"};
    final JComboBox selector = new JComboBox(charityArray);
    JPanel first = new JPanel();
    first.setLayout(new FlowLayout());
    first.add(selector);

    // User input JLabels and JTextFields
    JLabel nameLabel = new JLabel("First Name: ");
    final JTextField name = new JTextField();
    JLabel lastLabel = new JLabel("Last Name: ");
    final JTextField lastname = new JTextField();
    JLabel donationAmount = new JLabel("Donation Amount: ");
    final JTextField donation = new JTextField();


    JPanel second = new JPanel();
    second.setLayout(new GridLayout(4,2));
    second.add(nameLabel); second.add(name);
    second.add(lastLabel); second.add(lastname);
    second.add(donationAmount); second.add(donation);


    // Donate & Exit Buttons
    JButton donateButton = new JButton("Donate");
    JButton saveButton = new JButton("Save");
    JButton exitButton = new JButton("Exit");
    JButton openButton=  new JButton("Open File");
    JPanel third = new JPanel();
    third.setLayout(new FlowLayout());
    third.add(donateButton);
    third.add(saveButton);
    third.add(openButton);
    third.add(exitButton);

    // JTable display
    final DefaultTableModel model = new DefaultTableModel();
    JTable table = new JTable(model);
    model.addColumn("First Name");
    model.addColumn("Last Name");
    model.addColumn("Charity");
    model.addColumn("Donation");

    table.setShowHorizontalLines(true);
    table.setRowSelectionAllowed(true);
    table.setColumnSelectionAllowed(true);      
    JScrollPane scrollPane = JTable.createScrollPaneForTable(table);

    JPanel fourth = new JPanel();
    fourth.setLayout(new BorderLayout());
    fourth.add(scrollPane, BorderLayout.CENTER);

    // Button Events
    exitButton.addActionListener(new ActionListener() 
    {
        public void actionPerformed(ActionEvent e) 
        {
            System.exit(1); 
        }
    });

    openButton.addActionListener(new ActionListener()
    {
    public void actionPerformed(ActionEvent e){
    JFileChooser openChooser = new JFileChooser();
    int openStatus = openChooser.showOpenDialog(null);
    if(openStatus == JFileChooser.APPROVE_OPTION){
        try{
            File myFile = openChooser.getSelectedFile();
            BufferedReader br = new BufferedReader(new FileReader(myFile));

            String line;        
        while((line = br.readLine())!= null){
                             model.addRow(line.split(","));           

                    }//end while
                      br.close();
                }//end try

                catch(Exception e2){
                     JOptionPane.showMessageDialog(null, "Buffer Reader Error");
                }//end catch
            }
        }


        private void setValueAt(String line, int row, int col) {
            // TODO Auto-generated method stub

        }

    });

    saveButton.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e){
            JFileChooser fileChooser = new JFileChooser();
            int status = fileChooser.showSaveDialog(null);
            if (status == JFileChooser.APPROVE_OPTION)
            {
                fileChooser.addChoosableFileFilter(new FileNameExtensionFilter("Text", ".txt", "txt"));
                //fileChooser.setFileFilter(new FileFilter("txt"));
                PrintWriter output;
                try {
                    File file = fileChooser.getSelectedFile();
                    output = new PrintWriter(file +".txt");
                    for(int row = 0; row<table.getRowCount(); row++){
                        for(int col = 0; col<table.getColumnCount();col++){
                            output.println(table.getValueAt(row, col).toString());

                        }
                        output.println();
                    }

                    output.close();

                } catch (IOException e1) {
                    e1.printStackTrace();
                }

            }
        }

});
    donateButton.addActionListener(new ActionListener() 
    {
        public void actionPerformed(ActionEvent e) 
        {

            DecimalFormat df = new DecimalFormat("##,###.00");
            try 
            {

                Object[] rows = new Object[]{name.getText(), lastname.getText(), selector.getSelectedItem(),
                    donation.getText()};
                    model.addRow(rows);
                    name.setText("");
                    lastname.setText("");
                    donation.setText("");
            } 
            catch (Exception ex) 
            {
                JOptionPane.showMessageDialog(null, "Enter a Dollar Amount", "Alert", JOptionPane.ERROR_MESSAGE);
                return;
            }
        }
    });

    // Frame Settings
    frame.setSize(470,300);
    //frame.setLocation(300,200);
    cp.setLayout(new BoxLayout(cp, BoxLayout.Y_AXIS));
    cp.add(first);
    cp.add(second);
    cp.add(third);
    cp.add(fourth);
    frame.setVisible(true);

    }   
}

【问题讨论】:

  • 使用 DefaultTableModel 并调用其addRow(...) 方法来添加行。另外,不要使用==!= 比较字符串。请改用equals(...)equalsIgnoreCase(...) 方法。了解== 检查两个 对象引用 是否相同,这不是您感兴趣的。另一方面,这些方法检查两个字符串是否以相同的顺序具有相同的字符,这就是这里的重点。
  • 谢谢。我知道我必须在 addRow 之后的括号中传递一个值。我已经在将数据保存到文本文件中的按钮中完成了它。我只是不知道要传递什么来显示数据。

标签: java swing jtable jtextfield


【解决方案1】:

我知道我必须在 addRow 之后的括号中传递一个值。

人们不知道这意味着什么,因为您在此处发布的代码没有 addRow(...) 方法。

我看到你在 2 小时后发布了第二个问题:https://*.com/questions/30951407/how-to-properly-read-a-txt-file-into-a-a-row-of-a-jtable

将所有 cmets 放在一个地方,以便人们了解发生了什么。

此外,发布几行随机代码对我们没有帮助,因为我们不知道如何使用代码的上下文。例如,我不知道您是如何创建“模型”变量的。我不知道您是否曾经将模型添加到表格中。

在发布问题时发布正确的SSCCE,以便我们获得必要的信息。文件选择器与问题无关,因为我们无权访问您的真实文件。因此,您需要发布硬编码数据。一个简单的方法是使用StringReader

这是一个工作示例,展示了如何将文件读取/解析/加载到 JTable 中:

import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
import java.io.*;

public class SSCCE extends JPanel
{
    public SSCCE()
    {
        try
        {
            DefaultTableModel model = new DefaultTableModel(0, 4);

            String data = "1 2 3 4\na b c d\none two three four";
            BufferedReader br = new BufferedReader( new StringReader( data ) );
            String line;

            while ((line = br.readLine()) != null)
            {
                String[] split = line.split(" ");
                model.addRow( split );
            }

            JTable table = new JTable(model);
            add( new JScrollPane(table) );
        }
        catch (IOException e) { System.out.println(e); }
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new SSCCE());
        frame.setLocationByPlatform( true );
        frame.pack();
        frame.setVisible( true );
    }

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

您需要做的就是更改代码以使用 FileReader 而不是 StringReader。

【讨论】:

  • 谢谢。正如你所说,我已经做了一些改变,但我仍然得到同样的东西。我已经更新了代码以拥有所有内容,因此您可以更好地看到我拥有的所有内容。我需要它们水平显示在一行中,他们现在所做的只是垂直显示在一列中。
  • @sammyb123,您尚未发布 SSCCE(您发布了与所述问题无关的整个应用程序)您查看输入文件的格式了吗?您文件中的数据与我的 StringReader 中的数据有何不同?如果您的所有项目都显示在一列中,那可能是因为您将每一列数据保存在单独的行中。如果你想把所有的列都放在一行里,那就把数据保存在一行里,这意味着你需要在前三列使用print(...),然后在最后一列使用println(...)
【解决方案2】:

我想通了。感谢所有试图提供帮助的人。

openButton.addActionListener(new ActionListener()
    {
    public void actionPerformed(ActionEvent e){
    JFileChooser openChooser = new JFileChooser();
    int openStatus = openChooser.showOpenDialog(null);
    if(openStatus == JFileChooser.APPROVE_OPTION){
        try{
            File myFile = openChooser.getSelectedFile();
            //BufferedReader br = new BufferedReader(new FileReader(myFile));
                             Scanner br = new Scanner(new FileReader(myFile));
            String line;        
        while((line = br.nextLine())!= null){
                        Object[] myRow = new Object[]{line,br.nextLine(), br.nextLine(), br.nextLine()};
                             model.addRow(myRow);
                            // line = br.readLine();
                                if(br.nextLine()== " "){
                                    line=br.nextLine();
                                }
                    }//end while
                      br.close();
                }//end try

                catch(Exception e2){
                     return;
                }//end catch
            }
        }

    });

【讨论】:

  • 不是一个很好的解决方案。你不应该像那样只使用 readLine() 方法。如果文件中的行数不正确,您将生成 IOException。如果您有空行,您也可能会生成 IOException。行数据应该被视为行数据,这意味着每一行都应该是文件中的一行。然后,您应该使用分隔符(除了“”)来分隔每个列值并使用 split() 语句,如下所示。即使第一条评论告诉您不要这样做,您仍在使用“==”进行字符串比较。
  • 有些东西我还不能完全理解。我只有 3 周的 GUI 时间。我已将程序中的代码更改为具有 .equals()。至于空行,我用空行分隔每组输入的数据,我没有得到任何错误。我把代码跳过一个空行并从下一个读取。