【问题标题】:How to generate a table that can be inserted in a panel?如何生成可以插入面板的表格?
【发布时间】:2016-07-18 16:44:55
【问题描述】:

我真的很难将这段代码组装在一起。最终的计划是我有两个输入字段,一个要求名称,一个要求标记。然后我会输入一个名称和一个标记,按下按钮后程序会将这些值输入到一个表格中,通过总和将为该标记分配一个等级(A、B、C 等);最后,当输入所有值时,用户将按下另一个按钮,该按钮将在文本文件中打印出姓名和相应等级的列表。这就是结局。

目前我真的很难创建表格并将其放置在框架的下部,以便每次按下一个按钮时它都会更新。我的框架的下部是“myBottomPanel”。如果您能给我建议并可能在我完成游戏的过程中帮助我,我将不胜感激。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;

public class GradePanel2 extends JPanel {

    private JButton addEntry, calculate;
    private JLabel name, grade, nameResult, gradeResult;
    private JTextField nameField, gradeField;

    public GradePanel2() {
        // Button to add entry to list
        addEntry = new JButton("Add entry to list");
        addEntry.addActionListener(new buttonListener());
        // Button to print all entries in correct format
        calculate = new JButton("Print all user grades");
        calculate.addActionListener(new buttonListener());
        // Create Labels
        name = new JLabel("Enter student name: ");
        nameField = new JTextField(10);
        nameField.addActionListener(new buttonListener());
        grade = new JLabel("Enter students mark: ");
        gradeField = new JTextField(5);
        gradeField.addActionListener(new buttonListener());
        // Bottom segment for result
        setLayout(new BorderLayout());
        // Button Panel
        JPanel ButtonPane = new JPanel();
        ButtonPane.setLayout(new BoxLayout(ButtonPane, BoxLayout.PAGE_AXIS));
        addEntry.setAlignmentX(CENTER_ALIGNMENT);
        calculate.setAlignmentX(CENTER_ALIGNMENT);
        ButtonPane.add(Box.createVerticalStrut(15));
        ButtonPane.add(addEntry);
        ButtonPane.add(Box.createVerticalStrut(15));
        ButtonPane.add(calculate);
        // Label Panel
        JPanel labelPane = new JPanel();
        labelPane.setLayout(new BoxLayout(labelPane, BoxLayout.PAGE_AXIS));
        labelPane.add(name);
        labelPane.add(Box.createRigidArea(new Dimension(5, 0)));
        labelPane.add(nameField);
        labelPane.add(Box.createRigidArea(new Dimension(0, 2)));
        labelPane.add(grade);
        labelPane.add(Box.createRigidArea(new Dimension(5, 0)));
        labelPane.add(gradeField);
        myBottomPanel mybottompanel = new myBottomPanel();
        // Add all panels to the main panel
        add(labelPane, BorderLayout.NORTH);
        add(ButtonPane, BorderLayout.CENTER);
        add(mybottompanel, BorderLayout.SOUTH);
        setBackground(Color.WHITE);
        setPreferredSize(new Dimension(400, 300));
    }

    public class resultTable extends myBottomPanel {

        public void mainTable() {
            GridLayout mainLayout = (new GridLayout(1, 0));
            String[] columnNames = {"NAME", "GRADE"};
            Object[][] data = {{nameField.getText(), gradeField.getText()}};
            JTable table = new JTable(data, columnNames);
            table.setPreferredScrollableViewportSize(new Dimension(500, 70));
            table.setFillsViewportHeight(true);
            JScrollPane scrollPane = new JScrollPane(table);
            table.setFillsViewportHeight(true);
        }
    }

    public class myBottomPanel extends JPanel {

        public myBottomPanel() {
            resultTable results = new resultTable();
            add(results);
            setBorder(BorderFactory.createTitledBorder("Students/Results"));
            setOpaque(false);
        }
    }

    public class buttonListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent event) {
            String studentName;
            int studentMark;
            if (event.getSource() == addEntry) {
                studentName = nameField.getText();
                String intMark = gradeField.getText();
                studentMark = Integer.parseInt(intMark);
                System.out.println(studentName);
                System.out.println(studentMark);
            }
        }
    }
}

最后我不确定如何为论坛正确粘贴代码,所以请原谅前几行放错了位置;我只是为它们添加了 4 个空格,以便它们显示在代码中。

【问题讨论】:

    标签: java swing jtable


    【解决方案1】:

    您的现有代码在尝试从 GradePanel2 构造函数递归调用 MyBottomPanel 构造函数时抛出 java.lang.StackOverflowError

    专注于如何向表中添加行,您可能会从这个完整的工作开始example。更改 TableModel 以匹配您的用例,将一对文本字段添加到 panel,并更改 addRow() 以使用字段值。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    相关资源
    最近更新 更多