使用JavaSwing将内容从JTable输出到TextArea

使用JavaSwing将内容从JTable输出到TextArea,java,swing,Java,Swing,因此,我尝试使用JavaSwing制作一个基本的GUI。我有一些按钮,一个带有回车按钮的文本字段,还有一个更大的文本区域。单击“显示所有团队”按钮时,此按钮的操作侦听器应将JTable内容输出到文本区域,但它不起作用,也没有输出任何内容 package footballmanager; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; imp

因此,我尝试使用JavaSwing制作一个基本的GUI。我有一些按钮,一个带有回车按钮的文本字段,还有一个更大的文本区域。单击“显示所有团队”按钮时,此按钮的操作侦听器应将JTable内容输出到文本区域,但它不起作用,也没有输出任何内容

package footballmanager;

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

import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JList;
import javax.swing.JTextPane;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.JScrollBar;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;

public class FootballGUI 
    {
        private JFrame frame;
        private JTextField textField;


    //Launch the application.
    public static void main(String[] args)
    {
        FootballGUI window = new FootballGUI();
        window.frame.setVisible(true);
    }
    
    //Display the application
       public void displayGUI() {
       this.frame.setVisible(true);
   }
    
    //Create the application.
            
    public FootballGUI() 
    {
        frame = new JFrame();
        frame.setBounds(100, 100, 611, 471);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        // Text area
        final JTextArea testArea = new JTextArea(5,20);
        testArea.setBounds(6, 6, 329, 343);
        frame.getContentPane().add(testArea);
        
        // Buttons on the window
        JButton displayTeams = new JButton("Display all teams");
        // (x, y, w, h)
        displayTeams.setBounds(370, 6, 200, 29);
        frame.getContentPane().add(displayTeams);
        
        
        class MyActionListener implements ActionListener{
        public void actionPerformed(ActionEvent e) {
//                    String s = String.format("%s %s", "Club name", "Club points");
//                    testArea.setText(s);
                        String[] columnNames = {"First Name",
                                                "Last Name",
                                                "Sport",
                                                "# of Years",
                                                "Vegetarian"};
                                            Object[][] data = {
                        {"Kathy", "Smith",
                         "Snowboarding", new Integer(5), new Boolean(false)},
                        {"John", "Doe",
                         "Rowing", new Integer(3), new Boolean(true)},
                        {"Sue", "Black",
                         "Knitting", new Integer(2), new Boolean(false)},
                        {"Jane", "White",
                         "Speed reading", new Integer(20), new Boolean(true)},
                        {"Joe", "Brown",
                         "Pool", new Integer(10), new Boolean(false)}
                    };
                         JTable table = new JTable(data, columnNames);
                         
                         DefaultTableModel model1 = (DefaultTableModel) table.getModel();
                         int nRow = model1.getRowCount(), nCol = model1.getColumnCount();
                         Object [][] tableData = new Object [nRow] [nCol];
                         for (int i = 0; i < nRow; i++){
                             for (int j = 0; j < nCol; j++){
                             tableData [i][j] = model1.getValueAt (i,j);
                             testArea.append((String) tableData [i][j] + "\t");
                             }
                         }
                         testArea.append("\n");
                 
                 
                }
        }
            
        displayTeams.addActionListener(new MyActionListener());
        
        JButton goalSort = new JButton("Sort list by goals");
        goalSort.setBounds(370, 40, 200, 29);
        frame.getContentPane().add(goalSort);

        JButton winSort = new JButton("Sort list by most wins");
        winSort.setBounds(370, 74, 200, 29);
        frame.getContentPane().add(winSort);

        JButton randomMatch = new JButton("Generate random match");
        randomMatch.setBounds(370, 280, 200, 29);
        frame.getContentPane().add(randomMatch);
        
        JButton displayMatches = new JButton("Display all played matches");
        displayMatches.setBounds(370, 314, 200, 29);
        frame.getContentPane().add(displayMatches);

        JButton btnEnter = new JButton("Search for a match");
        btnEnter.setBounds(518, 404, 85, 39);
        frame.getContentPane().add(btnEnter);

        JScrollBar scrollBar = new JScrollBar();
        scrollBar.setBounds(320, 6, 15, 338);
        frame.getContentPane().add(scrollBar);
        
        textField = new JTextField();
        textField.setBounds(5, 410, 508, 28);
        frame.getContentPane().add(textField);
        textField.setColumns(10);
        
        JLabel lblMapGoesHere = new JLabel("List goes here");
        lblMapGoesHere.setBounds(342, 37, 263, 312);
        frame.getContentPane().add(lblMapGoesHere);
    }
}
但是它不起作用

嗯,你有一个ClassCastException。你不认为把这些信息放在问题中很重要吗

 JTable table = new JTable(data, columnNames);
 
 DefaultTableModel model1 = (DefaultTableModel) table.getModel();
 int nRow = model1.getRowCount(), nCol = model1.getColumnCount();
 Object [][] tableData = new Object [nRow] [nCol];
 for (int i = 0; i < nRow; i++){
     for (int j = 0; j < nCol; j++){
     tableData [i][j] = model1.getValueAt (i,j);
     testArea.append((String) tableData [i][j] + "\t");
     }
 }
当然,您还需要两个循环,一个用于行,一个用于列。

我重新编辑了GUI以使用JTable

下面是修改后的GUI的外观

以下是左键单击“显示所有团队”按钮后的外观

以下是我对您的GUI所做的主要更改

我通过调用SwingUtilities invokeLater方法启动Java应用程序。此方法可确保在上创建和使用回转组件

我使用了我创建的两个JPanel。JFrame内容窗格使用默认的BorderLayout。JTable JPanel使用默认的FlowLayout。JButton JPanel使用GridBagLayout。您使用的固定布局不允许我调整您使用的JTextArea的大小

我使用JTable来显示团队。我将JTable放在JScrollPane中,将JScrollPane放在JPanel中

在创建GUI之前,我创建了列和数据。通常,您希望首先创建应用程序模型,然后创建GUI。这是一个简单的模式示例

这是我使用的完整的可运行代码

import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;

public class FootballGUI implements Runnable {

    private DefaultTableModel model;
    private JFrame frame;
    private JTable table;
    private String[][] data;

    // Launch the application.
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new FootballGUI());
    }

    public FootballGUI() {
        String[] columnNames = { "First Name", "Last Name", "Sport", 
                "# of Years", "Vegetarian" };
        this.model = new DefaultTableModel();

        for (String s : columnNames) {
            model.addColumn(s);
        }

        this.data = new String[][] { { "Kathy", "Smith", "Snowboarding", "5", "false" },
                { "John", "Doe", "Rowing", "3", "true" }, 
                { "Sue", "Black", "Knitting", "2", "false" },
                { "Jane", "White", "Speed reading", "20", "true" }, 
                { "Joe", "Brown", "Pool", "10", "false" } };
    }

    // Create the application.
    @Override
    public void run() {
        frame = new JFrame("Football GUI");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.add(createTablePanel(), BorderLayout.CENTER);
        frame.add(createButtonPanel(), BorderLayout.AFTER_LINE_ENDS);

        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private JPanel createTablePanel() {
        JPanel panel = new JPanel();

        table = new JTable(model);
        JScrollPane scrollPane = new JScrollPane(table);
        panel.add(scrollPane);

        return panel;
    }

    private JPanel createButtonPanel() {
        JPanel panel = new JPanel(new GridBagLayout());
        panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.CENTER;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.insets = new Insets(5, 5, 5, 5);
        gbc.weightx = 1.0d;

        JButton displayTeams = new JButton("Display all teams");
        displayTeams.addActionListener(new MyActionListener());
        panel.add(displayTeams, gbc);

        gbc.gridy++;
        JButton goalSort = new JButton("Sort list by goals");
        panel.add(goalSort, gbc);

        gbc.gridy++;
        JButton winSort = new JButton("Sort list by most wins");
        panel.add(winSort, gbc);

        gbc.gridy++;
        JButton randomMatch = new JButton("Generate random match");
        panel.add(randomMatch, gbc);

        gbc.gridy++;
        JButton displayMatches = new JButton("Display all played matches");
        panel.add(displayMatches, gbc);

        gbc.gridy++;
        JButton btnEnter = new JButton("Search for a match");
        panel.add(btnEnter, gbc);

        return panel;
    }

    public class MyActionListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent event) {
            int count = model.getRowCount();
            for (int i = 0; i < count; i++) {
                model.removeRow(0);
            }
            
            for (int i = 0; i < data.length; i++) {
                model.addRow(data[i]);
            }
        }

    }
    
}

仅供参考,OP在最后一个问题中被建议使用布局管理器:@camickr:谢谢你的提醒。OP不会是唯一一个阅读这个问题和答案的人。好吧,所以我尝试在我的代码中实现代码的JTable和JScrollpane。但是,对于model.removeow0、model.addColumns和this.model=new DefaultTableModel,我得到了错误,错误表明它找不到这些的符号。请查看已编辑的代码。@JesleyNB:这是因为您没有在类中定义DefaultTableModel。我在回答中提供了工作代码。在您的上一个问题中,特别建议您不要使用空布局,而是使用布局管理器来避免问题。你为什么不听劝告?如果您继续忽略给出的建议,人们为什么要继续回答?如果Swing组件不是UI的一部分,它们可能无法按预期运行,因为它们不是通用数据结构。尝试使用System.out.print以确保正确生成文本。是的,我意识到只输出表格本身效率更高,所以我去掉了JTextArea。请查看已编辑的代码,因为我做了一些更改,但model.removeow0、model.addColumns和this.model=new DefaultTableModel有错误,错误是找不到这些符号。@JesleyNB,每篇文章一个问题。您已经有了工作代码,因此此问题已得到回答。如果你有一个新问题,你可以用一个新问题来提出一个新问题来演示这个问题。
import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;

public class FootballGUI implements Runnable {

    private DefaultTableModel model;
    private JFrame frame;
    private JTable table;
    private String[][] data;

    // Launch the application.
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new FootballGUI());
    }

    public FootballGUI() {
        String[] columnNames = { "First Name", "Last Name", "Sport", 
                "# of Years", "Vegetarian" };
        this.model = new DefaultTableModel();

        for (String s : columnNames) {
            model.addColumn(s);
        }

        this.data = new String[][] { { "Kathy", "Smith", "Snowboarding", "5", "false" },
                { "John", "Doe", "Rowing", "3", "true" }, 
                { "Sue", "Black", "Knitting", "2", "false" },
                { "Jane", "White", "Speed reading", "20", "true" }, 
                { "Joe", "Brown", "Pool", "10", "false" } };
    }

    // Create the application.
    @Override
    public void run() {
        frame = new JFrame("Football GUI");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.add(createTablePanel(), BorderLayout.CENTER);
        frame.add(createButtonPanel(), BorderLayout.AFTER_LINE_ENDS);

        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private JPanel createTablePanel() {
        JPanel panel = new JPanel();

        table = new JTable(model);
        JScrollPane scrollPane = new JScrollPane(table);
        panel.add(scrollPane);

        return panel;
    }

    private JPanel createButtonPanel() {
        JPanel panel = new JPanel(new GridBagLayout());
        panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.CENTER;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.insets = new Insets(5, 5, 5, 5);
        gbc.weightx = 1.0d;

        JButton displayTeams = new JButton("Display all teams");
        displayTeams.addActionListener(new MyActionListener());
        panel.add(displayTeams, gbc);

        gbc.gridy++;
        JButton goalSort = new JButton("Sort list by goals");
        panel.add(goalSort, gbc);

        gbc.gridy++;
        JButton winSort = new JButton("Sort list by most wins");
        panel.add(winSort, gbc);

        gbc.gridy++;
        JButton randomMatch = new JButton("Generate random match");
        panel.add(randomMatch, gbc);

        gbc.gridy++;
        JButton displayMatches = new JButton("Display all played matches");
        panel.add(displayMatches, gbc);

        gbc.gridy++;
        JButton btnEnter = new JButton("Search for a match");
        panel.add(btnEnter, gbc);

        return panel;
    }

    public class MyActionListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent event) {
            int count = model.getRowCount();
            for (int i = 0; i < count; i++) {
                model.removeRow(0);
            }
            
            for (int i = 0; i < data.length; i++) {
                model.addRow(data[i]);
            }
        }

    }
    
}