将 JTable 添加到 JTabbedPane 内的 JScrollPane

Adding JTable to JScrollPane inside JTabbedPane

我正在尝试将 JTable 放入 JScrollPaneJScrollPaneJPanel 里面,它是 JTabbedPane.

的一部分

代码如下:

JScrollPane scrollPane = new JScrollPane(); 
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);    scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);              

    JPanel pnlMaxMinAvg1 = new JPanel();
    scrollPane.setViewportView(pnlMaxMinAvg1);
    tabbedPane.addTab("MaxMinAvg1", null, pnlMaxMinAvg1, null);
    pnlMaxMinAvg1.setLayout(new BorderLayout(0,0)); 

table = new JTable();
        table.setModel(new DefaultTableModel(
            new Object[][] {{"V_L1_N_RMS_AVG", null}
},
            new String[] {
                "Variable", "Value"
            }
        ));
        table.setBounds(178, 11, 200,300);

scrollPane.add(table);

当我运行这个的时候,table是不显示的。如果我设置:

pnlMaxMinAvg1.add(table);

然后 table 可见。

为什么?

当您将其设为 scrollPane 的视口视图时,您的 JPanelpnlMaxMinAvg1 是空的。将 table 添加到 pnlMaxMinAvg1 可以让滚动窗格显示一些非空内容。此外,避免 setBounds() 并让布局完成工作。在下面的示例中,滚动窗格的视图被显式设置为 table,就像在您的片段中一样,但您可以在滚动窗格的构造函数中指定它。

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

/**
 * @see 
 */
public class TableTest {

    private void display() {
        JFrame f = new JFrame("TableTest");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JTable table = new JTable();
        table.setModel(new DefaultTableModel(
            new Object[][]{{"V_L1_N_RMS_AVG", null}},
            new String[]{"Variable", "Value"}
        ));
        JScrollPane jsp = new JScrollPane();
        jsp.setViewportView(table);
        JTabbedPane jtp = new JTabbedPane();
        jtp.add("TableTest", jsp);
        f.add(jtp);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new TableTest()::display);
    }
}

在此变体中,我添加了 N 行数据并覆盖了 Scrollable 方法 getPreferredScrollableViewportSize(),如图 here 所示。调整封闭的 window 以查看它如何影响滚动条。

import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

/**
 * @see 
 */
public class TableTest {

    private static final int N = 16;

    private void display() {
        JFrame f = new JFrame("TableTest");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        DefaultTableModel model = new DefaultTableModel(
            null, new String[]{"Variable", "Value"}
        );
        JTable table = new JTable(model) {

            @Override
            public Dimension getPreferredScrollableViewportSize() {
                return new Dimension(256, getRowHeight() * N / 2);
            }
        };
        for (int i = 0; i < N; i++) {
            model.addRow(new Object[]{"V_L1_N_RMS_AVG" + i, String.valueOf(i)});
        }
        JScrollPane jsp = new JScrollPane();
        jsp.setViewportView(table);
        JTabbedPane jtp = new JTabbedPane();
        jtp.add("TableTest", jsp);
        f.add(jtp);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new TableTest()::display);
    }
}