Java Swing 添加多个 JTable 到 JFrame

JavaSwing add multiple JTable to JFrame

我正在研究 java swing application.I 必须浏览多个 CSV 数据文件并使用 JTable.I 将它们显示到 JFrame 中我正在尝试将多个(非静态)JTable 添加到 JFrame.All (N) JTable 我想包含在 JSrollPane.At 中,此时我只能向 JScrollPane 显示 1 table。

提前致谢!

if (e.getSource() == jbtreadbrowsefile) {

            try {

                for(int k=0;k<file_locations.length;k++) {

                    String currentLocation=file_locations[k];
                    inputList = new ArrayList();
                    File inputF = new File(currentLocation);
                    InputStream inputFS = new FileInputStream(inputF);
                    BufferedReader br = new BufferedReader(new InputStreamReader(inputFS));
                    inputList = br.lines().collect(Collectors.toList());
                    br.close();

                       int count = inputList.size();

                       if(count>0)
                       {
                           data = new String[count - 1][8];
                           for (int i = 0; i < count - 1; i++) {

                           String[] arrOfStr = inputList.get(i + 1).toString().split(",");
                           String test1= arrOfStr[0];
                           String test2= arrOfStr[1];
                           String test3= arrOfStr[2];
                           String test4 = arrOfStr[3];
                           String test5= arrOfStr[4];
                           String test6= arrOfStr[5];
                           String test7= arrOfStr[6];

                           data[i][0] = "" + (i + 1);
                           data[i][1] = test1;
                           data[i][2] = test2;
                           data[i][3] = test3;
                           data[i][4] = test4;
                           data[i][5] = test5;
                           data[i][6] = test6;
                           data[i][7] = test7;

                       }

                       j = new JTable(data, columnNames);
                       TableColumnModel tcm = j.getColumnModel();
                       tcm.getColumn(0).setPreferredWidth(40);
                       tcm.getColumn(1).setPreferredWidth(220);
                       tcm.getColumn(2).setPreferredWidth(120);
                       tcm.getColumn(3).setPreferredWidth(80);
                       tcm.getColumn(4).setPreferredWidth(80);
                       tcm.getColumn(5).setPreferredWidth(80);
                       tcm.getColumn(6).setPreferredWidth(80);
                       tcm.getColumn(7).setPreferredWidth(80);

                       DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
                       centerRenderer.setHorizontalAlignment(JLabel.CENTER);
                       j.getColumnModel().getColumn(0).setCellRenderer(centerRenderer);

                       for (int i = 0; i < j.getRowCount(); i++) {
                           j.setRowHeight(i, 20);
                       }

                       j.getTableHeader().setFont(new Font("SansSerif", Font.BOLD, 15));
                       j.getTableHeader().setReorderingAllowed(false);
                       j.repaint();



                       JScrollPane sp = new JScrollPane(j); 
                       sp.setBounds(10, 200, 780, 440);
                       add(sp);



                       }
                   else
                       {
                           JOptionPane.showMessageDialog(this,"No Data Found in the File");
                       }


                }
JScrollPane sp = new JScrollPane(j); 
sp.setBounds(10, 200, 780, 440);
add(sp);

不要使用 setBounds()。确定组件的 size/location 是布局管理器的工作。

At this moment i can display only 1 table to JScrollPane.

正确。 JScrollPane 旨在显示单个 JTable。 JTable 的 header 将显示在滚动窗格的 header 视图中,而 table 将显示在滚动窗格的中央。根据 table.

中的数据,您还可以在滚动窗格中看到滚动条

如果您想 "merge" 将多个文件中的数据放入同一个 table,则需要使用每个文件中的数据更新 TableModel,而不是创建新的 table每次。

您可以使用 DefaultTableModeladdRow(…) 方法向模型动态添加数据。

为了将每个 JTable 显示到 JFrame 中,我将所有 JTable 添加到一个 JPanel 中并将这个 JPanel 添加到 JScrollPane.After 中以显示每个 JTable 问题是我们无法显示每个 JTable header.I 添加到另一个JPanel 每个 JTable header 并且显示出来。

if (e.getSource() == jbtreadbrowsefile) {

            GridLayout grid = new GridLayout(0, 1, 30, 20);
            jpaneltable=new JPanel(grid);
            try {

                for(int k=0;k<file_locations.length;k++) {

                    String currentLocation=file_locations[k];
                    inputList = new ArrayList();
                    File inputF = new File(currentLocation);
                    InputStream inputFS = new FileInputStream(inputF);
                    BufferedReader br = new BufferedReader(new InputStreamReader(inputFS));
                    inputList = br.lines().collect(Collectors.toList());
                    br.close();

                       int count = inputList.size();

                       if(count>0)
                       {
                           data = new String[count - 1][8];
                           for (int i = 0; i < count - 1; i++) {

                           String[] arrOfStr = inputList.get(i + 1).toString().split(",");
                           String test1= arrOfStr[0];
                           String test2= arrOfStr[1];
                           String test3= arrOfStr[2];
                           String test4= arrOfStr[3];
                           String test5= arrOfStr[4];
                           String test6= arrOfStr[5];
                           String test7= arrOfStr[6];

                           data[i][0] = "" + (i + 1);
                           data[i][1] = test1;
                           data[i][2] = test2;
                           data[i][3] = test3;
                           data[i][4] = test4;
                           data[i][5] = test5;
                           data[i][6] = test6;
                           data[i][7] = test7;

                       }

                       j = new JTable(data, columnNames);
                       TableColumnModel tcm = j.getColumnModel();
                       tcm.getColumn(0).setPreferredWidth(40);
                       tcm.getColumn(1).setPreferredWidth(220);
                       tcm.getColumn(2).setPreferredWidth(120);
                       tcm.getColumn(3).setPreferredWidth(80);
                       tcm.getColumn(4).setPreferredWidth(80);
                       tcm.getColumn(5).setPreferredWidth(80);
                       tcm.getColumn(6).setPreferredWidth(80);
                       tcm.getColumn(7).setPreferredWidth(80);

                       DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
                       centerRenderer.setHorizontalAlignment(JLabel.CENTER);
                       j.getColumnModel().getColumn(0).setCellRenderer(centerRenderer);

                       for (int i = 0; i < j.getRowCount(); i++) {
                           j.setRowHeight(i, 20);
                       }

                       j.getTableHeader().setFont(new Font("SansSerif", Font.BOLD, 15));
                       j.getTableHeader().setReorderingAllowed(false);

                       j.getTableHeader().setPreferredSize(new Dimension(0,HEADER_HEIGHT));
                       j.repaint();


                       jpaneltable.add(j.getTableHeader(),BorderLayout.NORTH);
                       jpaneltable.add(j, BorderLayout.CENTER);


                       }
                   else
                       {
                           JOptionPane.showMessageDialog(this,"No Data Found in the File");
                       }


                }

                JScrollPane sp = new JScrollPane(jpaneltable,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
                sp.setBounds(10, 200, 780, 440);
                add(sp);



            }