在双JTable中调整列大小的问题 [英] Issue with resizing columns in a double JTable

查看:52
本文介绍了在双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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆