因此,我尝试使用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);
}
}
2条答案
按热度按时间jtoj6r0c1#
但是它不起作用
好吧,你有一个阶级例外。你不认为把这些信息放在问题中很重要吗?
上面的逻辑是什么意思?
为什么要将数据添加到一个jtable中,在那里数据显示格式良好,然后尝试在一个jtextarea中复制并显示它,而在jtextarea中数据没有格式化?
为什么要从模型中获取数据并尝试将数据添加到二维数组中?
你为什么要访问tablemodel?
您可以直接从jtable获取信息。您只需要:
当然,您还需要两个循环,一个用于行,一个用于列。
qkf9rpyu2#
我重拨了你的gui以使用


JTable
.下面是修改后的gui的样子。
以下是左键单击“显示所有团队”按钮后的效果。
以下是我对您的gui所做的主要更改。
我通过调用
SwingUtilities
invokeLater
方法。此方法确保在事件调度线程上创建和使用swing组件。我用了两个swing布局管理器
JPanels
我创造了。jframe内容窗格使用默认值BorderLayout
. 这个JTable
JPanel
使用默认值FlowLayout
. 这个JButton
JPanel
使用GridBagLayout
. 你使用的固定布局不允许我调整JTextArea
你在用。我用了一个
JTable
显示团队。我把JTable
在一个JScrollPane
,和JScrollPane
在一个小房间里。在创建gui之前,我创建了列和数据。通常,您希望首先创建应用程序模型,然后创建gui。这是模型/视图/控制器模式的一个简单示例。
下面是我使用的完整的可运行代码。