当前位置: 首页 > 知识库问答 >
问题:

加载用户在JTable中插入的所有单元格内容,并将其作为对象存储在LinkedList中

陆翰学
2023-03-14

我有一个2列的JTable,这个JTable有N行(其中N取决于其他任务),并在每个单元格中显示之前设置一个默认值。每行有一个字符串和一个int值。

我需要这个表格,当我点击OK按钮时,发送所有单元格数据(在用户编辑这些数据之后),作为对象与链表中的2个数据(行x列x)耦合。(接收字符串和int的对象构造函数作业尚未完成。)

我如何编码这个???

这是生成带有my JTable和2个按钮(确定和取消)的windows的代码:

    /**
     * Create the frame.
     */
    public InsertJobWindows() {
        setTitle("Welcome");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 551, 293);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);

        JPanel panel_1 = new JPanel();

        JButton btnNewButton = new JButton("    OK   ");
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
            }
        });
        panel_1.add(btnNewButton);

        JButton btnNewButton_1 = new JButton("Cancel");
        btnNewButton_1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                InsertJobWindows.this.dispose();
            }
        });

        JPanel panel = new JPanel();

        final JTable table = new JTable(new MyTableModel());
        table.setPreferredScrollableViewportSize(new Dimension(500, 70));
        table.setFillsViewportHeight(true);
        table.getSelectionModel().addListSelectionListener(
                new ListSelectionListener() {
                    public void valueChanged(ListSelectionEvent event) {
                        int viewRow = table.getSelectedRow();
                        JLabel statusText=new JLabel();
                        if (viewRow < 0) {
                            //Selection got filtered away.
                            statusText.setText("");
                        } else {
                            int modelRow = 
                                table.convertRowIndexToModel(viewRow);
                            statusText.setText(
                                String.format("Selected Row in view: %d. " +
                                    "Selected Row in model: %d.", 
                                    viewRow, modelRow));
                        }
                    }
                }
        );


                //Create the scroll pane and add the table to it.
                JScrollPane scrollPane = new JScrollPane(table);

                        //Set up column sizes.
                        initColumnSizes(table);

        panel_1.add(btnNewButton_1);
        GroupLayout gl_contentPane = new GroupLayout(contentPane);
        gl_contentPane.setHorizontalGroup(
            gl_contentPane.createParallelGroup(Alignment.LEADING)
                .addGroup(gl_contentPane.createSequentialGroup()
                    .addGroup(gl_contentPane.createParallelGroup(Alignment.TRAILING, false)
                        .addComponent(panel_1, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(panel, GroupLayout.DEFAULT_SIZE, 525, Short.MAX_VALUE))
                    .addContainerGap())
        );
        gl_contentPane.setVerticalGroup(
            gl_contentPane.createParallelGroup(Alignment.LEADING)
                .addGroup(gl_contentPane.createSequentialGroup()
                    .addComponent(panel, GroupLayout.PREFERRED_SIZE, 213, GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(ComponentPlacement.RELATED, 61, Short.MAX_VALUE)
                    .addComponent(panel_1, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
        );
        GroupLayout gl_panel = new GroupLayout(panel);
        gl_panel.setHorizontalGroup(
            gl_panel.createParallelGroup(Alignment.LEADING)
                .addGroup(gl_panel.createSequentialGroup()
                    .addGap(11)
                    .addComponent(scrollPane, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(12, Short.MAX_VALUE))
        );
        gl_panel.setVerticalGroup(
            gl_panel.createParallelGroup(Alignment.LEADING)
                .addGroup(gl_panel.createSequentialGroup()
                    .addGap(5)
                    .addComponent(scrollPane, GroupLayout.DEFAULT_SIZE, 197, Short.MAX_VALUE)
                    .addContainerGap())
        );
        panel.setLayout(gl_panel);
        contentPane.setLayout(gl_contentPane);



    }

    private void initColumnSizes(JTable table) {
        MyTableModel model = (MyTableModel)table.getModel();
        TableColumn column = null;
        Component comp = null;
        int headerWidth = 0;
        int cellWidth = 0;
        Object[] longValues = model.longValues;
        TableCellRenderer headerRenderer =
            table.getTableHeader().getDefaultRenderer();

        for (int i = 0; i < 2; i++) {
            column = table.getColumnModel().getColumn(i);

            comp = headerRenderer.getTableCellRendererComponent(
                                 null, column.getHeaderValue(),
                                 false, false, 0, 0);
            headerWidth = comp.getPreferredSize().width;

            comp = table.getDefaultRenderer(model.getColumnClass(i)).
                             getTableCellRendererComponent(
                                 table, longValues[i],
                                 false, false, 0, i);
            cellWidth = comp.getPreferredSize().width;

            if (DEBUG) {
                System.out.println("Initializing width of column "
                                   + i + ". "
                                   + "headerWidth = " + headerWidth
                                   + "; cellWidth = " + cellWidth);
            }

            column.setPreferredWidth(Math.max(headerWidth, cellWidth));
        }
    }


    class MyTableModel extends AbstractTableModel {
        private String[] columnNames = {"JobName", "time"};
        int numJobs=JobManager.loadNumJob();
        private Object[][] data = getDefaultTableData();

        public Object[][] getDefaultTableData(){
            Object[][] tabella=new Object[numJobs][2];
            for(int i=0; i<numJobs; i++){
                for(int j=0; j<2; j++){
                    tabella[i][j]="insert the correct data";
                }
            }

            return tabella;
        }

        public int getColumnCount() {
            return columnNames.length;
        }

        public int getRowCount() {
            return numJobs;
        }

        public String getColumnName(int col) {
            return columnNames[col];
        }

        public Object getValueAt(int row, int col) {
            return data[row][col];
        }

        public Class getColumnClass(int c) {
            return getValueAt(0, c).getClass();
        }

        public boolean isCellEditable(int row, int col) {
            return true;
        }

        public void setValueAt(Object value, int row, int col) {
            if (DEBUG) {
                System.out.println("Setting value at " + row + "," + col
                                   + " to " + value
                                   + " (an instance of "
                                   + value.getClass() + ")");
            }

            data[row][col] = value;
            fireTableCellUpdated(row, col);

            if (DEBUG) {
                System.out.println("New value of data:");
                printDebugData();
            }
        }


        public void run() {
            try {
                InsertJobWindows frame = new InsertJobWindows();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
}

共有1个答案

别俊誉
2023-03-14

改变你的表模型来保存你的作业的LinkedList(或者更简单地说,一个List)。

有点像这样:

public class Job {
    public int time; // Should n't this be a long?
    public String jobName;
}

class MyTableModel extends AbstractTableModel {
    private String[] columnNames = {"JobName", "time"};
    int numJobs=JobManager.loadNumJob();
    private List<Job> data = getDefaultTableData();

    public List<Job> getDefaultTableData(){
        List<Job> jobs = new LinkedList<Job>();
        for(int i=0; i<numJobs; i++) {
            Job job = new Job();
            job.time = /* Some int value */ 0;
            job.jobName= /* Some string value */ "";
            jobs.add(job);
        }

        return jobs;
    }

    public int getColumnCount() {
        return columnNames.length;
    }

    public int getRowCount() {
        return jobs.size();
    }

    public String getColumnName(int col) {
        return columnNames[col];
    }

    public Object getValueAt(int row, int col) {
        if (col==0) {
            return data.get(row).jobName;
        } else if (col==1) {
            return data.get(row).time;
        }
        return null;
    }

    public Class getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    }

    public boolean isCellEditable(int row, int col) {
        return true;
    }

    public void setValueAt(Object value, int row, int col) {
        if (DEBUG) {
            System.out.println("Setting value at " + row + "," + col
                               + " to " + value
                               + " (an instance of "
                               + value.getClass() + ")");
        }

        if (col==0) {
            data.get(row).jobName = value; // Here do the casts and necessary checks.
        } else if (col==1) {
            data.get(row).time= value; // Here do the casts and necessary checks.
        }
        fireTableCellUpdated(row, col);

        if (DEBUG) {
            System.out.println("New value of data:");
            printDebugData();
        }
    }
 类似资料:
  • 问题内容: 我想用来编码大量数据,而不必一次将所有数据加载到内存中。 我以为json包中内置了此功能,但事实并非如此。 操场 我目前只是在自己构建json字符串。 操场 有一个更好的方法吗? 如果json.Marshaler像这样,那将是微不足道的。 问题答案: 不幸的是,该程序包还没有办法做到这一点。您现在(手动)执行的操作是执行此操作的最佳方法,而无需修改内置程序包。 如果要打补丁,则可以在e

  • 问题内容: 我有一个无法解决的问题。 众所周知,我对使用JTables还是比较陌生,所以答案可能很简单,但是我找不到解决方案:/ 所以,我有一个使用AbstractTableModel的JTable,它重写了 方法,以告知要显示的每一列的类型。其中之一是布尔值。 当我创建一个简单的JTable时,使用 一切都很好,并且使用复选框(开/关)可以正确显示布尔值。 现在,我想将文本放在每个单元格的中心(

  • 我有个问题无法解决。 一切都很好,并且使用复选框(ON/OFF)正确显示布尔值。 现在,我想将文本居中放在每个单元格上(稍后可能还有更多选项)。 因此我为每个列定义了一个新的DefaultTableCellRenderer,如下所示: 编辑:谢谢你的所有澄清。事实上,我真正的问题是:“如何影响JTable的所有DefaultRenderer,使它们将结果集中在JTable的单元格中。”

  • 问题内容: 我有一个要存储’raw’的数据框: 但似乎试图“解压” numpy.array。 有解决方法吗?除了使用包装器之外(请参见下面的编辑)? 我尝试没有成功。 编辑 这行得通,但是我必须使用’dummy’类来包装数组,这不能令人满意,也不是很优雅。 问题答案: 在numpy数组周围使用包装器,即将numpy数组作为列表传递 输出: 或者您可以通过创建元组来使用,即如果您有一个数据框 输出:

  • 问题内容: 如何加载Spring资源内容并将其用于设置bean属性或将其作为参数构造函数传递? 该资源包含自由文本。 问题答案: 此解决方案需要Apache Commons IO。 @Parvez建议的另一种没有Apache Commons IO依赖性的解决方案是

  • 如EhCache留档所述: 实际上,这意味着持久性内存中缓存将启动,其所有元素都将在磁盘上。[...]因此,Ehcache设计不会在启动时将它们全部加载到内存中,而是根据需要懒惰地加载它们。 我希望内存缓存启动时将所有元素都存储在内存中,我该如何实现? 这是因为我们的网站对缓存执行了大量的访问,所以我们第一次访问网站时,它的响应时间非常长。