如何从txt文件中读取分开的部分以在Java GUI中显示?

huangapple go评论72阅读模式
英文:

How do I read separate parts from a txt File to show in Java GUI?

问题

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import java.awt.Color;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class TicketStats extends JFrame {

    private JPanel contentPane;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    TicketStats frame = new TicketStats();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public TicketStats() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 1016, 566);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        
        JButton backButton = new JButton("Back");
        backButton.setBounds(846, 11, 144, 54);
        backButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                dispose();
                User user = new User();
                user.setVisible(true);
            }
        });
        contentPane.setLayout(null);
        backButton.setFont(new Font("Tahoma", Font.PLAIN, 16));
        contentPane.add(backButton);
        
        JLabel lblNewLabel = new JLabel("Ticket Info");
        lblNewLabel.setFont(new Font("Tahoma", Font.BOLD, 36));
        lblNewLabel.setBounds(385, 66, 227, 44);
        contentPane.add(lblNewLabel);
        
        JLabel lblNewLabel_1 = new JLabel("Ticket Type");
        lblNewLabel_1.setFont(new Font("Tahoma", Font.PLAIN, 16));
        lblNewLabel_1.setBounds(183, 164, 108, 25);
        contentPane.add(lblNewLabel_1);
        
        JLabel lblNewLabel_2 = new JLabel("Ticket Price");
        lblNewLabel_2.setFont(new Font("Tahoma", Font.PLAIN, 16));
        lblNewLabel_2.setBounds(358, 164, 108, 25);
        contentPane.add(lblNewLabel_2);
        
        JLabel lblNewLabel_3 = new JLabel("Tickets Left");
        lblNewLabel_3.setFont(new Font("Tahoma", Font.PLAIN, 16));
        lblNewLabel_3.setBounds(535, 164, 108, 25);
        contentPane.add(lblNewLabel_3);
        
        JLabel lblNewLabel_4 = new JLabel("Match Date");
        lblNewLabel_4.setFont(new Font("Tahoma", Font.PLAIN, 16));
        lblNewLabel_4.setBounds(699, 164, 108, 25);
        contentPane.add(lblNewLabel_4);
        
        JLabel lblNewLabel_5 = new JLabel("VIP-AC");
        lblNewLabel_5.setFont(new Font("Tahoma", Font.PLAIN, 12));
        lblNewLabel_5.setBounds(183, 228, 76, 14);
        contentPane.add(lblNewLabel_5);
        
        JLabel lblNewLabel_6 = new JLabel("30$");
        lblNewLabel_6.setFont(new Font("Tahoma", Font.PLAIN, 12));
        lblNewLabel_6.setBounds(358, 228, 76, 14);
        contentPane.add(lblNewLabel_6);
        
        JLabel lblNewLabel_7 = new JLabel("66");
        lblNewLabel_7.setFont(new Font("Tahoma", Font.PLAIN, 12));
        lblNewLabel_7.setBounds(535, 228, 82, 14);
        contentPane.add(lblNewLabel_7);
        
        JLabel lblNewLabel_8 = new JLabel("30/10/2020");
        lblNewLabel_8.setBounds(699, 228, 76, 14);
        contentPane.add(lblNewLabel_8);
        
        File file = new File("Ticket.txt");
        try(BufferedReader reader = new BufferedReader(new FileReader(file))) {
            StringBuilder sb = new StringBuilder();
            String text;
            
            while((text = reader.readLine()) != null) {
                sb.append(text).append(", ");
            }
        } catch (IOException ioe) {
            ioe.printStackTrace();
        } 
        
        JSeparator separator = new JSeparator();
        separator.setBounds(172, 201, 621, 2);
        contentPane.add(separator);
        
        JSeparator separator1 = new JSeparator();
        separator1.setForeground(Color.BLACK);
        separator1.setOrientation(SwingConstants.VERTICAL);
        separator1.setBounds(664, 164, 2, 283);
        contentPane.add(separator1);
        
        JSeparator separator_1 = new JSeparator();
        separator_1.setOrientation(SwingConstants.VERTICAL);
        separator_1.setForeground(Color.BLACK);
        separator_1.setBounds(487, 164, 2, 283);
        contentPane.add(separator_1);
        
        JSeparator separator_2 = new JSeparator();
        separator_2.setOrientation(SwingConstants.VERTICAL);
        separator_2.setForeground(Color.BLACK);
        separator_2.setBounds(314, 164, 2, 283);
        contentPane.add(separator_2);
        
    }
}

Please note that this code is exactly the same as the code you provided, without any translation. If you need assistance with understanding or modifying the code, please feel free to ask.

英文:

So here like this picture I need to show the stats of the tickets I have in a txt file. I've separated the 4 fields using ", " in my file but I don't know how to show them separately in GUI, i.e. for the 4 fields there under Ticket price I need to show the prices which is the 2nd part of every line in my txt file, and for Ticket Amounts the 3rd part of every line from the file. So how do I show them? And I have set an Demo of how should it look like and for every type in the picture I need to show similar lines for every type that's in the txt file. So basically I need to show from "VIP-AC, 30$, 66, 30/10/2020" to this and so on (for the next lines)

and this is my code till now:

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import java.awt.Color;
public class TicketStats extends JFrame {
private JPanel contentPane;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
TicketStats frame = new TicketStats();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public TicketStats() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 1016, 566);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
JButton backButton = new JButton("Back");
backButton.setBounds(846, 11, 144, 54);
backButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dispose();
User user = new User();
user.setVisible(true);
}
});
contentPane.setLayout(null);
backButton.setFont(new Font("Tahoma", Font.PLAIN, 16));
contentPane.add(backButton);
JLabel lblNewLabel = new JLabel("Ticket Info");
lblNewLabel.setFont(new Font("Tahoma", Font.BOLD, 36));
lblNewLabel.setBounds(385, 66, 227, 44);
contentPane.add(lblNewLabel);
JLabel lblNewLabel_1 = new JLabel("Ticket Type");
lblNewLabel_1.setFont(new Font("Tahoma", Font.PLAIN, 16));
lblNewLabel_1.setBounds(183, 164, 108, 25);
contentPane.add(lblNewLabel_1);
JLabel lblNewLabel_2 = new JLabel("Ticket Price");
lblNewLabel_2.setFont(new Font("Tahoma", Font.PLAIN, 16));
lblNewLabel_2.setBounds(358, 164, 108, 25);
contentPane.add(lblNewLabel_2);
JLabel lblNewLabel_3 = new JLabel("Tickets Left");
lblNewLabel_3.setFont(new Font("Tahoma", Font.PLAIN, 16));
lblNewLabel_3.setBounds(535, 164, 108, 25);
contentPane.add(lblNewLabel_3);
JLabel lblNewLabel_4 = new JLabel("Match Date");
lblNewLabel_4.setFont(new Font("Tahoma", Font.PLAIN, 16));
lblNewLabel_4.setBounds(699, 164, 108, 25);
contentPane.add(lblNewLabel_4);
JLabel lblNewLabel_5 = new JLabel("VIP-AC");
lblNewLabel_5.setFont(new Font("Tahoma", Font.PLAIN, 12));
lblNewLabel_5.setBounds(183, 228, 76, 14);
contentPane.add(lblNewLabel_5);
JLabel lblNewLabel_6 = new JLabel("30$");
lblNewLabel_6.setFont(new Font("Tahoma", Font.PLAIN, 12));
lblNewLabel_6.setBounds(358, 228, 76, 14);
contentPane.add(lblNewLabel_6);
JLabel lblNewLabel_7 = new JLabel("66");
lblNewLabel_7.setFont(new Font("Tahoma", Font.PLAIN, 12));
lblNewLabel_7.setBounds(535, 228, 82, 14);
contentPane.add(lblNewLabel_7);
JLabel lblNewLabel_8 = new JLabel("30/10/2020");
lblNewLabel_8.setBounds(699, 228, 76, 14);
contentPane.add(lblNewLabel_8);
File file = new File("Ticket.txt");
try(BufferedReader reader = new BufferedReader(new FileReader(file))) {
StringBuilder sb = new StringBuilder();
String text;
while((text = reader.readLine()) != null) {
sb.append(text).append(", ");
}
} catch (IOException ioe) {
ioe.printStackTrace();
} 
JSeparator separator = new JSeparator();
separator.setBounds(172, 201, 621, 2);
contentPane.add(separator);
JSeparator separator1 = new JSeparator();
separator1.setForeground(Color.BLACK);
separator1.setOrientation(SwingConstants.VERTICAL);
separator1.setBounds(664, 164, 2, 283);
contentPane.add(separator1);
JSeparator separator_1 = new JSeparator();
separator_1.setOrientation(SwingConstants.VERTICAL);
separator_1.setForeground(Color.BLACK);
separator_1.setBounds(487, 164, 2, 283);
contentPane.add(separator_1);
JSeparator separator_2 = new JSeparator();
separator_2.setOrientation(SwingConstants.VERTICAL);
separator_2.setForeground(Color.BLACK);
separator_2.setBounds(314, 164, 2, 283);
contentPane.add(separator_2);
}
}

答案1

得分: 2

以下是用于读取分隔文本文件中数据并在 JTable 中显示数据的基本示例:

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

public class TableFromFile extends JPanel {
    public TableFromFile() {
        setLayout(new BorderLayout());

        JTable table = new JTable(getTableModel());
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        JScrollPane scrollPane = new JScrollPane(table);
        add(scrollPane);
    }

    private TableModel getTableModel() {
        String delimiter = ":";
        DefaultTableModel model = new DefaultTableModel();

        try {
            BufferedReader reader = getFileReader();

            // 第一行包含列名
            String line = reader.readLine();
            model.setColumnIdentifiers(line.split(delimiter));

            // 文件中的其余行是数据
            while ((line = reader.readLine()) != null) {
                model.addRow(line.split(delimiter));
            }

            reader.close();
        } catch (Exception e) {
            System.out.println(e);
        }

        return model;
    }

    private BufferedReader getFileReader() {
        // 创建数据以模拟从文件中读取数据
        String data =
            "Letter:Number\n" +
            "A:1\n" +
            "B:2\n" +
            "C:3";

        BufferedReader reader = new BufferedReader(new StringReader(data));

        // 在实际应用中,数据将来自文件
        // Reader reader = new BufferedReader(new FileReader(...));

        return reader;
    }

    private static void createAndShowUI() {
        JFrame frame = new JFrame("Table From File");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new TableFromFile());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

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

上述示例使用“:”作为文件中字符串的单字符分隔符。

由于您使用两个字符作为分隔符,因此您需要使用稍微复杂一些的正则表达式来进行拆分。所以您的拆分语句应该是:

model.addRow(line.split(":\\s"));
英文:

A basic example for reading data in a delimited text file and displaying the data in a JTable follows:

import java.awt.*;
import java.io.*;
import javax.swing.*;
import javax.swing.table.*;
public class TableFromFile extends JPanel
{
public TableFromFile()
{
setLayout( new BorderLayout() );
JTable table = new JTable( getTableModel() );
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane = new JScrollPane( table );
add( scrollPane );
}
private TableModel getTableModel()
{
String delimiter = ":";
DefaultTableModel model = new DefaultTableModel();
try
{
BufferedReader reader = getFileReader();
//  First line will contain the column names
String line = reader.readLine();
model.setColumnIdentifiers( line.split(delimiter) );
//  Remaining lines in the file will be the data
while ((line = reader.readLine()) != null)
{
model.addRow( line.split(delimiter) );
}
reader.close();
}
catch(Exception e) { System.out.println(e); }
return model;
}
private BufferedReader getFileReader()
{
//  Create data to simulate reading data from a file
String data =
"Letter:Number\n" +
"A:1\n" +
"B:2\n" +
"C:3";
BufferedReader reader = new BufferedReader( new StringReader( data ) );
//  In your real application the data would come from a file
//Reader reader = new BufferedReader( new FileReader(...) );
return reader;
}
private static void createAndShowUI()
{
JFrame frame = new JFrame("Table From File");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( new TableFromFile() );
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible( true );
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}

The above example uses ":" as the single character delimiter for the strings in the file.

Since you are using two characters as the delimiter you will need to use a slightly more complex regex to do the split. So your split statement would be:

model.addRow( line.split(":\\s") );

huangapple
  • 本文由 发表于 2020年10月8日 00:11:51
  • 转载请务必保留本文链接:https://go.coder-hub.com/64248097.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定