【发布时间】:2014-07-22 10:47:05
【问题描述】:
请看下面的代码sn-p,
public class FrameFoo extends JFrame {
private TableAdapter mAdapter;
public FrameFoo() {
HashMap<Integer, String> m = new HashMap<Integer, String>();
m.put(1, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
m.put(2, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
m.put(3, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
m.put(4, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
m.put(5, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
m.put(6, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
m.put(7, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
mAdapter = new TableAdapter(m);
initComponents();
}
private void initComponents() {
mScrollPane = JScrollPane();
mTable = new JTable();
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setPreferredSize(new java.awt.Dimension(400, 200));
setResizable(false);
mTable.setModel(mAdapter);
mTable.setRowHeight(35);
mScrollPane.setViewportView(mTable);
getContentPane().add(mScrollPane, BorderLayout.CENTER);
pack();
}
public static void main(String args[]) {
try {
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
EventQueue.invokeLater(new Runnable() {
public void run() {
new FrameFoo().setVisible(true);
}
});
}
private JScrollPane mScrollPane;
private JTable mTable;
}
还有这个;
public class TableAdapter extends AbstractTableModel {
private Map<Integer, String> m;
/*
* Assume no changes (add/remove) to m will be made after initialization.
*/
public TableAdapter(Map<Integer, String> m) {
this.m = m;
}
public void notifyDataSetChanged() {
fireTableDataChanged();
}
@Override
public int getRowCount() {
return m.size();
}
@Override
public int getColumnCount() {
return 2;
}
@Override
public String getValueAt(int rowIndex, int columnIndex) {
if (columnIndex < 0 || columnIndex > 1) {
throw new IllegalArgumentException();
}
return columnIndex == 0 ? rowIndex + 1 + "" : m.get(rowIndex + 1);
}
}
现在,当我向表格添加数据时,它会在需要时显示垂直滚动条,但它没有显示水平滚动条,而是在最后一列中裁剪字符串。我不明白这里出了什么问题..
这就是它的样子,
【问题讨论】:
-
可能需要覆盖 JScrollBars 策略,可能需要阻止某些内容(例如 PreferredSize 和使用的 LayoutManager),以便更好地帮助尽快发布 SSCCE/MCVE、简短、可运行、可使用 JTable/XxxTableModel 的硬编码值进行编译
-
不要
setPreferredSize;覆盖getPreferredScrollableViewportSize。 -
是的,那个副本就是我认为的答案!
-
@CanadianDavid 在第一条评论中提出问题的解决方案对我不起作用..
-
覆盖
JTable的getPreferredSize()方法。覆盖getPreferredSize()而不是setPreferredSize()方法。
标签: java swing jtable jscrollpane tablemodel