簡體   English   中英

jtable變為可見后無法設置列寬

[英]unable to set column width after jtable becomes visible

我已經閱讀了數百次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選擇字體系列,column2字體樣式,column3字體大小,column4字母,column5數字,column6標點符號和column7符號。

將允許用戶選擇哪些列可見。 正如我所提到的,當顯示表更新時,數據不是它應該的位置。 即,用戶選擇隱藏列,數字和符號,然后選擇要顯示的新字體,樣式和大小。

正如我所指出的,刪除表格列不僅增加了復雜性

我同意,並且我給了你管理這種復雜性的代碼。 我看到你沒有嘗試代碼,即使它可以用一行代碼添加到你的程序中。

嘗試添加和刪除表中的數據

這不是問題。 TableColumn所做的就是將TableModel中的數據映射到TableColumn。 當您創建TableColumn時,它的默認列值為0.所以是的,除非您正確管理,否則您將遇到問題,這就是我為您提供工作代碼鏈接的原因。

我的問題是,在調用setMin,setPreferred和setMax時,為什么不調整列大小。

答案是代碼執行的順序很重要。 這是首選大小必須在最小/最大大小的范圍內,因此您需要設置最后的首選大小:

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

編輯:

簡單的例子。 您可以將其稱為MCVESSCCE

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是否正常工作,那么我不知道會發生什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM