在双JTable中调整列大小的问题 [英] Issue with resizing columns in a double JTable
问题描述
我正在创建一个包含2个JTable的自定义组件,一个作为主要数据网格,另一个作为始终可见的摘要栏,我提出了此解决方案,但是调整列的大小无法正常工作,任何想法都有我做错了吗?
I am creating a custom component containing 2 JTables, one as the main data grid and other as the always visible summary bar and I have come up this solution, but resizing columns is not working as it should be, any ideas what have I done wrong?
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
public class FixedRow2Tables extends JFrame
{
private static final long serialVersionUID = 4676303089799270571L;
Object[][] data;
Object[] column;
JTable fixedTable, table;
public FixedRow2Tables()
{
super("Fixed Row Example");
Object[][] mainData = new Object[][] { { "a", "", "", "", "", "" },
{ "", "b", "", "", "", "" }, { "", "", "c", "", "", "" },
{ "", "", "", "d", "", "" }, { "", "", "", "", "e", "" },
{ "", "", "", "", "", "f" } };
Object[][] summaryData = { { "fixed1", "", "", "", "", "" },
{ "fixed2", "", "", "", "", "" } };
column = new Object[] { "A", "B", "C", "D", "E", "F" };
table = new JTable(mainData, column);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
fixedTable = new JTable(summaryData, column);
fixedTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
fixedTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
fixedTable.setTableHeader(null);
fixedTable.setColumnModel(table.getColumnModel());
JScrollPane scroll = new JScrollPane(table);
scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
scroll.setPreferredSize(new Dimension(400, 100));
getContentPane().add(scroll, BorderLayout.CENTER);
getContentPane().add(fixedTable, BorderLayout.SOUTH);
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
FixedRow2Tables frame = new FixedRow2Tables();
frame.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
frame.pack();
frame.setVisible(true);
}
});
}
}
推荐答案
fixedTable.setColumnModel(table.getColumnModel());
问题出在那一行.如果您将其注释掉,则表将正常运行.如果这样会破坏您的代码(因为我不知道您要确切执行什么操作),请发表评论.
The problem lies in that line. If you comment it out the Table behaves normally. If that breaks your code (As I don't know what you want to do exactly) just comment.
但是,正如您在注释中添加的那样,您想同步两个表.我找到了一个讨论该问题的论坛主题:
But as you added in your comment, you want to sync the two tables. I found a forum thread that covers exactly that problem:
http://forums.sun.com/thread.jspa?threadID=713021
玩得开心!
P.S .:以防万一论坛主题消失(只是复制了文本):
P.S.: Just in case the forum thread vanishes (Just copied the text):
首先连接表格.必须共享ColumnModel,否则它将不起作用.面板都有一个JTable字段,并且set和get ColumnModel方法委托给JTable.
First hook up the tables. Had to share the ColumnModel otherwise it did not work. The panels both have a JTable field and the set and get ColumnModel methods delegate to the JTable.
infoPanel.setColumnModel(overviewPanel.getColumnModel());
overviewPanel.getColumnModel().addColumnModelListener(infoPanel);
infoPanel.getColumnModel().addColumnModelListener(overviewPanel);
然后处理ChangeEvent:
Then handle the ChangeEvent:
public void columnMarginChanged(ChangeEvent event) {
final TableColumnModel eventModel = (DefaultTableColumnModel)event.getSource();
final TableColumnModel thisModel = getTable().getColumnModel();
final int columnCount = eventModel.getColumnCount();
for (int i = 0; i < columnCount; i++) {
thisModel.getColumn(i).setWidth(eventModel.getColumn(i).getWidth());
}
repaint();
}
这篇关于在双JTable中调整列大小的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!