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