- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我注意到,当我有一个带有 JScrollPane 包含的 TableRowSorter 的 JTable 时,直到我为排序器创建 SortKeys 后才会出现垂直滚动条(这是通过为其中一列调用toggleSortOrder() 来完成的) .
我的问题是为什么? SortKeys 与垂直滚动条有什么关系?
更新:添加了 SSCCE,可打开 JFrame,其中 JScrollPane 内有 JTable,该 JFrame 与“填充”按钮一起位于容器中。最初绘制表格时,没有数据,因此不需要滚动条。当我填充 20 行后,需要一个滚动条,但没有出现。
有两种方法可以让滚动条出现:
删除容器的refresh()方法中带注释的调用toggleSortOrder()。
//table.getRowSorter().toggleSortOrder(0);
toggleSortOrder()
调用 setSortKeys()
调用 sort()
调用 fireRowSorterChanged()
并最终捕获某些内容事件并添加滚动条。
package test;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.WindowConstants;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableRowSorter;
@SuppressWarnings("serial")
public class TestFrame extends JFrame
{
class MyTableModel extends AbstractTableModel
{
public List<String> names = new ArrayList<String>();
public int getRowCount ()
{
return names.size();
}
public int getColumnCount ()
{
return 2;
}
public String getColumnName (int columnIndex)
{
return columnIndex > 0 ? "Name" : "Number";
}
public Class<?> getColumnClass (int columnIndex)
{
return String.class;
}
public Object getValueAt (int row, int col)
{
return row < names.size() ? col == 0 ? Integer.toString(row) : names.get(row) : "";
}
public void refresh (List<String> names)
{
this.names = names;
}
}
class MyContainer extends java.awt.Container implements ActionListener
{
JTable table;
MyTableModel model = new MyTableModel();
private TableRowSorter<MyTableModel> sorter;
public MyContainer()
{
}
public void init ()
{
sorter = new TableRowSorter<MyTableModel>(model);
table = new JTable(model);
table.setBorder(BorderFactory.createEmptyBorder());
table.setRowHeight(35);
table.getTableHeader().setPreferredSize(new Dimension(200, 35));
table.setRowSorter(sorter);
table.setPreferredScrollableViewportSize(new Dimension(200, 70));
table.setFillsViewportHeight(true);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
//Create the scroll pane and add the table to it.
JScrollPane scrollPane = new JScrollPane(table);
scrollPane.setBounds(10, 10, 200, 210);
//Add the scroll pane to this panel.
add(scrollPane);
JButton btn = new JButton("Populate");
btn.setActionCommand("populate");
btn.addActionListener(this);
btn.setBounds(10, 220, 200, 35);
add(btn);
}
public void refresh (List<String> rows)
{
model.refresh(rows);
try
{
// Notify sorter that model data (possibly number of rows) has changed.
// Without this call, the sorter assumes the number of rows is the same.
table.getRowSorter().allRowsChanged();
// Do we really want to toggle the sort order every time we refresh?
// User can toggle the sort order himself by clicking on the
// appropriate header cell.
List<?> keys = table.getRowSorter().getSortKeys();
if (null == keys || keys.isEmpty())
{
// table.getRowSorter().toggleSortOrder(0);
}
} catch (Exception e)
{
e.printStackTrace();
}
table.repaint();
}
public void actionPerformed(ActionEvent e)
{
if ("populate".equals(e.getActionCommand()))
{
List<String> rows = new ArrayList<String>();
for (int ii = 0; ii < 20; ii++)
{
rows.add(String.format("%02d", new Integer(ii)));
}
refresh(rows);
}
}
MyTableModel getModel ()
{
return model;
}
}
public static void main (String args[])
{
new TestFrame();
}
MyContainer myContainer = new MyContainer();
TestFrame()
{
myContainer.init();
myContainer.table.getSelectionModel().clearSelection();
add(myContainer);
this.setSize(240, 310);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//pack();
setVisible(true);
}
}
最佳答案
嗯,这并不是真正的 SSCCE,因为您使用的是自定义 TableModel。如果您创建了正确的 SSCCE,您将使用 DefaultTableModel,以便使用标准 JDK 类测试您的代码。如果您这样做,那么您会发现代码可以工作。
那么您的下一步将是使用自定义 TableModel 尝试代码,您会发现代码不起作用。
那么您在论坛上的问题是为什么代码不能与我的自定义 TableModel 一起使用? SSCCE 的重点是进行基本调试以隔离发生错误的位置,以便我们有信息可以使用。在您最初的问题中,我们不知道您在哪里使用自定义类。
无论如何,问题是当数据发生更改时,您的自定义 TableModel 没有通知表。在您的 refresh(...)
方法中,您需要在重置包含数据的列表后添加以下内容:
fireTableRowsInserted(0, names.size()-1);
任何代码中都不需要 table.repaint()
。
关于java - JScrollPane 滚动条只有在调用 rowSorter.toggleSortOrder() 后才会出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24940806/
我注意到,当我有一个带有 JScrollPane 包含的 TableRowSorter 的 JTable 时,直到我为排序器创建 SortKeys 后才会出现垂直滚动条(这是通过为其中一列调用togg
我是一名优秀的程序员,十分优秀!