我有一个Java Swing GUI,并在JTable
中遇到了JScrollPane
的问题。出于某种原因,当在程序执行期间增加表模型的行时,JScrollPane
不会更新 - 也就是说,如果行增加,那么表的高度超过了表的高度滚动视图,滚动窗格未按预期更新。 (新行按预期显示在屏幕上)。如果调整窗口大小,则滚动按预期更新。
垂直滚动策略为VERTICAL_SCROLLBAR_AS_NEEDED
,表模型fireTableDataChanged
被调用..
不幸的是,代码有点复杂,所以我无法提供导致问题的代码示例。但想想是否有人直接提出了一些想法......
编辑:还有点混乱:水平滚动策略为HORIZONTAL_SCROLLBAR_AS_NEEDED
,如果表格宽度超出视图宽度(即使用水平滚动条),则问题不会发生......
EDIT2:问题不在于桌子应该滚动,而是滚动条未按预期激活。
答案 0 :(得分:4)
您可能需要发布一些代码。我刚刚敲了下面的测试,它按照宣传的方式工作,即当行数超过视口高度时激活垂直滚动条:
import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ScrollPaneConstants;
import javax.swing.table.AbstractTableModel;
public class JTableTest {
public static void main(String[] args) {
final MyTableModel tm = new MyTableModel();
tm.addData(new Data("R1C1", "R1C2"));
JTable table = new JTable(tm);
JScrollPane scrollPane = new JScrollPane(table);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
JFrame frame = new JFrame();
frame.setLayout(new GridLayout());
frame.add(scrollPane);
frame.pack();
frame.setSize(400, 150);
frame.setVisible(true);
Thread t = new Thread(new Runnable() {
private int count = 2;
public void run() {
for ( ; ; ) {
tm.addData(new Data("R" + count + "C1", "R" + count + "C2"));
count++;
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
t.start();
}
private static class MyTableModel extends AbstractTableModel {
private List<Data> dataList = new ArrayList<Data>();
public int getColumnCount() {
return 2;
}
public void addData(Data data) {
dataList.add(data);
fireTableRowsInserted(dataList.size()-1, dataList.size()-1);
}
public int getRowCount() {
return dataList.size();
}
public Object getValueAt(int rowIndex, int columnIndex) {
Data data = dataList.get(rowIndex);
return columnIndex == 0 ? data.data1 : data.data2;
}
}
private static class Data {
public String data1;
public String data2;
public Data(String data1, String data2) {
this.data1 = data1;
this.data2 = data2;
}
}
}
答案 1 :(得分:0)
嗯..在回到问题后我发现我们在JScrollPane中自定义行标题导致了问题。 (一些首选大小被设置为不那么明智的值等)。