ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – jtable变为可见后无法设置列宽

2019-05-28 17:48:36  阅读:274  来源: 互联网

标签:java swing jtable jtableheader preferredsize


我已经阅读了数百次Oracle的API,在这里和其他地方阅读了无数文章,并且在jtable变得可见之后我仍然无法调整列的大小.
正如你可以推断的那样,我也试图使用jcheckbox来设置列的可见性.正如其他文章所述,使用addColumn和removeColumn不会将列返回到其原始位置.我之前使用过一个额外的类来保存列信息,例如列本身,它的标识符和原始索引.在列的可见性发生变化之后添加/删除数据的问题变得很混乱.我注意到数据不在正确的列中.因此,我选择设置列的minWidth,preferredWidth和maxWidth.

现在我的问题是,当setColumnVisible设置为true时,下面的代码不会调整列的宽度.用julius summner miller的话说,为什么会这样呢?

import java.awt.*;
import java.awt.event.*;

import java.util.*;

import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
import javax.swing.table.*;

class run
{
    public static void main(String args[])
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                Viewer viewer = new Viewer();

                JFrame jframe = new JFrame();
                jframe.add(viewer);
                jframe.createBufferStrategy(1); // required for dual monitor issues
                jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                jframe.setLocation(50,100);
                jframe.pack();
                jframe.setVisible(true);
            }
        });
    }
}

class Viewer extends JPanel
{
    static final long serialVersionUID = 0;

    DefaultTableModel defaultTableModel;
    JTable jtable;
    JCheckBox jcheckBox[];

    public Viewer()
    {
        this.setLayout(new BorderLayout());

        JPanel jpanel = new JPanel(new BorderLayout());

        String columnNames[] = {"a","b","c","d","e"};

        Object tableData[][] = 
        {
            {"a1","b1","c1","d1","e1"},
            {"a2","b2","c2","d2","e2"},
            {"a3","b3","c3","d3","e3"}
        };

        defaultTableModel = new DefaultTableModel(tableData,columnNames);

        jtable = new JTable(defaultTableModel);

        JScrollPane jscrollPane = new JScrollPane(jtable);

        jpanel.add(jscrollPane,BorderLayout.CENTER);

        TableColumnModel tableColumnModel = jtable.getColumnModel();

        int columnCount = tableColumnModel.getColumnCount();

        jcheckBox = new JCheckBox[columnCount];

        JPanel visibility = new JPanel(new GridLayout(1,columnCount));

        for (int column = 0; column < columnCount; column++)
        {
            TableColumn tableColumn = tableColumnModel.getColumn(column);

            String identifier = (String)tableColumn.getIdentifier();

            jcheckBox[column] = new JCheckBox(identifier,true);
            jcheckBox[column].setName(identifier);
            jcheckBox[column].addActionListener(new ColumnListener());

            visibility.add(jcheckBox[column]);
        }

        jpanel.add(visibility,BorderLayout.SOUTH);

        this.add(jpanel,BorderLayout.CENTER);
    }

    public void setColumnVisible(String identifier, boolean setVisible)
    {
        TableColumn tableColumn = jtable.getColumn(identifier);

        int minWidth = 0;
        int preferredWidth = 0;
        int maxWidth = 0;

        if (setVisible)
        {
            minWidth = 100;
            preferredWidth = 100;
            maxWidth = 100;
        }

        tableColumn.setMinWidth(minWidth);
        tableColumn.setPreferredWidth(preferredWidth);
        tableColumn.setMaxWidth(maxWidth);

        //jtable.doLayout(); does not work
        //jtable.validate(); does not work
        //jtable.getTableHeader().resizeAndRepaint(); does not work
    }

    class ColumnListener implements ActionListener
    {
        public void actionPerformed(ActionEvent actionEvent)
        {
            JCheckBox checkBox = (JCheckBox)actionEvent.getSource();

            boolean setVisible = checkBox.isSelected();

            String identifier = checkBox.getName();

            setColumnVisible(identifier,setVisible);
        }
    }
}

附录doLayout(),validate()resizeAndRepaint()不起作用,也没有将setAutoResizeMode设置为off.

注意:正如你们中的一些人可能已经发现的那样,调整大小确实在隐藏所有列之后工作.但是,在调用setMin,setPreferred和setMax时,它仍然无法解答为什么不调整列大小的问题.

注意:我正在编写一个字体查看器,可以同时显示多个字体的名称,样式和大小.我有一个显示已安装字体的jtable(column1显示字体系列,column2显示相应字体的字母,column3显示相应字体中的数字(0-9).我提供的示例代码将用于显示上述内容,给出用户可以选择隐藏字母或数字.我还有6个jlist,其中3个包含可用的字体系列,样式和大小,另外3个包含用户选择.我使用另一个jtable来显示用户选择(column1 selected font family,column2字体样式,column3字体大小,column4字母,column5数字,column6标点符号和column7符号.
将允许用户选择哪些列可见.正如我所提到的,当显示表更新时,数据不是它应该的位置.即,用户选择隐藏列,数字和符号,然后选择要显示的新字体,样式和大小.

解决方法:

as i have pointed out, removing the table column not only adds complexity

我同意,并且我给了你管理这种复杂性的代码.我看到你没有尝试代码,即使它可以用一行代码添加到你的程序中.

try adding and removing data from the table

这不是问题. TableColumn所做的就是将TableModel中的数据映射到TableColumn.当您创建TableColumn时,它的默认列值为0.所以是的,除非您正确管理,否则您将遇到问题,这就是我为您提供工作代码链接的原因.

my question as to why column sizes are not adjusted when invoking setMin, setPreferred and setMax.

答案是代码执行的顺序很重要.这是首选大小必须在最小/最大大小的范围内,因此您需要设置最后的首选大小:

    tableColumn.setMinWidth(minWidth);
    tableColumn.setMaxWidth(maxWidth);
    tableColumn.setPreferredWidth(preferredWidth);

编辑:

简单的例子.您可以将其称为MCVE或SSCCE.

import java.awt.*;
import javax.swing.table.*;

public class Main
{
    public static void main(String[] args)
    {
        TableColumn tc = new TableColumn();
        tc.setMinWidth(1);
        tc.setMaxWidth(10);
        tc.setPreferredWidth(15);
        System.out.println( tc.getPreferredWidth() );
    }
}

如果这不能验证API是否正常工作,那么我不知道会发生什么.

标签:java,swing,jtable,jtableheader,preferredsize
来源: https://codeday.me/bug/20190528/1172752.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有