- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我已经阅读了 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);
编辑:
简单的例子。您可以将其称为 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 - jtable 可见后无法设置列宽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25954752/
函数参数中或显示尺寸时(高度,宽度)的顺序是否有约定? 最佳答案 我不知道大量的语言,但我使用过的语言(宽度,高度)。它更适合沿着 (x, y) 坐标线。 关于language-agnostic -
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 6 年前。 Improve th
有没有办法显示自定义宽度/高度的YouTube视频? 最佳答案 在YouTube网站上的this link中: You can resize the player by editing the obj
如何从此表单获取数据(数据的长表示): import pandas as pd df = pd.DataFrame({ 'c0': ['A','A','B'], 'c1': ['b',
我在让宽度为 900px 的页面在宽度低于 900px 的分辨率下看起来不错时遇到了一些麻烦。这包括智能手机等移动设备。看起来我在页面上放大了,但无法滚动或缩小。我的页面包装器被定义为以屏幕为中心。这
我有一个包含一个表的 div,它有另一个带有动态变化文本的 div。div 有样式 overflow: hidden; white-space: nowrap; text-overflow: elli
我一直在愚弄下面的html代码。我已将 div id ="mainWide"设置为 2500 像素的宽度,这比我的屏幕还宽,我希望在主浏览器窗口中有一个水平滚动条,而不是在 div block 本身中
当我的屏幕浏览器窗口在 992px-1199px 之间时,我的文章元素比它们的父 div (.wrapper) 更宽。所以在这个屏幕宽度下,面板重叠并且看起来不对。 在所有其他屏幕宽度下,我的代码都准
我在对齐某些行时遇到了一些问题。我正在显示一个占据视口(viewport) 100% 高度的部分。因此,当您在屏幕上查看此部分时,您只会看到此部分。 在这个部分中,我有一个标题和副标题。标题应显示在节
为什么表单输入字段比其父 div 宽?宽度应用于文本 div,但不应用于其中包含表单字段的 div。为什么会这样? See the livecode here. .parent { width:
我想让这个标题 100% 宽。我在 jsfiddle 上试过这个,但是左边和右边还有一些余量。 CSS: #header { background: url("../img/top-bg.png
我的页面宽度有问题。无论我尝试什么,它的左边或右边都有白边(默认情况下在右边,如果我使用 margin-right:0 则在左边)。如果我使用 margin:0 比它留在右边。尝试了我所知道的一切,但
我有一个带有背景图片的宽 div。 div 的宽度为 1100 像素,当浏览器窗口小于该宽度时,会出现滚动条。有什么办法可以避免滚动条吗?那不是任何黑客。现在我知道我可以把它放在 body image
我有一个您可以访问的应用程序 here .当您打开应用程序时,只需单击加号按钮,您就会看到一个带有搜索栏的模态窗口。 现在请执行这两个搜索: 搜索 1:AAA 搜索 2:AAE 您会看到,在 AAE
这个问题在这里已经有了答案: Does element width include padding? (5 个答案) 关闭 7 年前。 HTML CSS .wrap{widt
我正在尝试在工具栏中创建一个自定义显示,类似于 Xcode 工具栏中心的信息 Pane 。 我们如何创建一个宽度超过 32 点的 NSToolbarItem? 框架始终将其限制为 32 点,即使最小和
我想将df1转换成df2 旧示例数据框 df1 df1 长),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/359
我正在使用 JavaScript 代码在 FireBase/FireStore 中上传图像。 核心功能已经可以运行,我可以上传,但我还需要在上传之前检查图像的大小。这就是我很乐意获得帮助的地方。 以下
如何在 Tkinter 中设置/更改 ttk.Separator 对象的长度/宽度? ttk.Separator(self, orient='horizontal').grid(c
我有一个简单的问题。为什么 a 不会自动调整其内容的大小?像这样: Test 返回 width:100%,尽管我希望“Test”这个词简单地居中。有什么想法吗? 最佳答案 您的问题与 HT
我是一名优秀的程序员,十分优秀!