gpt4 book ai didi

java - jtable 可见后无法设置列宽

转载 作者:搜寻专家 更新时间:2023-11-01 02:08:08 25 4
gpt4 key购买 nike

我已经阅读了 Oracle 的 API 数百遍,阅读了无数文章,无论是在此处还是在其他地方,但在 jtable 可见后我仍然无法调整列的大小。

正如您可以推断的那样,我还尝试使用 jcheckboxes 设置列的可见性。如其他文章所述,使用 addColumn 和 removeColumn 不会将列返回到它们的原始位置。我以前使用了一个额外的类来保存列信息,例如列本身、它的标识符和原始索引。这变得困惑以及在更改列的可见性后添加/删除数据的问题。我注意到数据不在正确的列中。因此,我选择设置列的最小宽度、首选宽度和最大宽度。

现在我的问题是,当 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 设置为关闭也不起作用。

注意:正如你们中的一些人可能已经发现的那样,调整大小确实有效 AFTER 所有列都被隐藏了。但是,它仍然没有回答我关于为什么在调用 setMin、setPreferred 和 setMax 时不调整列大小的问题。

注意:我正在编写一个可以同时显示多个字体系列、样式和大小的字体查看器。我有一个显示已安装字体的 jtable(第 1 列显示字体系列,第 2 列显示相应字体的字母表,第 3 列显示相应字体的数字(0-9)。

我提供的示例代码将用于显示上述内容,让用户可以选择隐藏字母或数字。

我还有 6 个 jlist,其中 3 个包含可用的字体系列、样式和大小,另外 3 个包含用户选择。我使用另一个 jtable 来显示用户选择(第 1 列选择的字体系列、第 2 列字体样式、第 3 列字体大小、第 4 列字母表、第 5 列数字、第 6 列标点符号和第 7 列符号。

用户将被允许选择哪些列是可见的。正如我所提到的,当更新显示表时,数据不在其应有的位置。即用户选择隐藏列、数字和符号,然后选择要显示的新字体、样式和大小。

最佳答案

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);

编辑:

简单的例子。您可以将其称为 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 是否正常工作,那么我不知道什么会。

关于java - jtable 可见后无法设置列宽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25954752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com