【问题标题】:JavaSwing add multiple JTable to JFrameJava Swing向JFrame添加多个JTable
【发布时间】:2020-09-29 21:07:51
【问题描述】:

我正在开发 java swing 应用程序。我必须浏览多个 CSV 数据文件并使用 JTable 将它们显示到 JFrame 中。我正在尝试将多个(非静态)JTable 添加到 JFrame 中。我想要包含的所有(N)JTable在 JSrollPane 内。此时我只能向 JScrollPane 显示 1 个表。

提前致谢!

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");
                       }


                }

【问题讨论】:

    标签: java swing jtable jpanel jscrollpane


    【解决方案1】:
    JScrollPane sp = new JScrollPane(j); 
    sp.setBounds(10, 200, 780, 440);
    add(sp);
    

    不要使用 setBounds()。布局管理器的工作是确定组件的大小/位置。

    此时我只能向 JScrollPane 显示 1 个表格。

    正确。 JScrollPane 旨在显示单个 JTable。 JTable 的标题将显示在滚动窗格的标题视图中,表格将显示在滚动窗格的中心。然后,您可能还会在滚动窗格中看到滚动条,具体取决于表中的数据。

    如果您想将多个文件中的数据“合并”到同一个表中,则需要使用每个文件中的数据更新 TableModel,而不是每次都创建一个新表。

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

    【讨论】:

    • 我一直在寻找这个答案,你是对的。这是满足我需求的更好方法,但此时我应该在单独的 JTable 中显示 CSV 数据文件并解决它。我会发布并回答我的问题,对于未来的用户,我认为如果接受答案会更好,这将是我自己的答案,因为它与问题直接相关。我现在有一个小问题,如果你能提供帮助,我将不胜感激。我不能更改每个 JTable 的表头。谢谢!
    【解决方案2】:

    为了将每个 JTable 显示到 JFrame 中,我将所有 JTable 添加到 JPanel 中,并将此 JPanel 添加到 JScrollPane 中。显示每个 JTable 后,问题是我们无法显示每个 JTable 标题。我将每个 JTable 标题添加到另一个 JPanel,它是出现了。

    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);
    
    
    
                }
    

    【讨论】:

    • 我们无法显示每个 JTable 标题。 - 您将 JTable 添加到单独的 JScrollPane,然后将滚动窗格添加到面板。如果要查看表头,则必须将每个表添加到其自己的滚动窗格中。
    猜你喜欢
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    相关资源
    最近更新 更多