将 JTable 添加到 JTabbedPane 内的 JScrollPane
Adding JTable to JScrollPane inside JTabbedPane
我正在尝试将 JTable
放入 JScrollPane
。 JScrollPane
在 JPanel
里面,它是 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
的视口视图时,您的 JPanel
、pnlMaxMinAvg1
是空的。将 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);
}
}
我正在尝试将 JTable
放入 JScrollPane
。 JScrollPane
在 JPanel
里面,它是 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
的视口视图时,您的 JPanel
、pnlMaxMinAvg1
是空的。将 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);
}
}