gpt4 book ai didi

java - 如何在 JTable 中动态设置 RowHeight

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:30:24 25 4
gpt4 key购买 nike

我想在 JTable 中放置一个比给定的单元格宽度更长的字符串。如何动态设置 rowHeight 以便读取整个字符串?这是一个例子:

import javax.swing.*;

public class ExampleTable {

public JPanel createTable() {
JPanel totalGUI = new JPanel();

//define titles for table
String[] title = {"TITLE1", "TITLE2", "TITLE3"};

//table data
Object[][] playerdata = {
{new Integer(34), "Steve", "test test test"},
{new Integer(32), "Patrick", "dumdi dumdi dummdi dumm di di didumm"},
{new Integer(10), "Sarah", "blabla bla bla blabla bla bla blabla"},};

//create object 'textTable'
JTable textTable = new JTable(playerdata,title);

//set column width
textTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
textTable.getColumnModel().getColumn(0).setPreferredWidth(60);
textTable.getColumnModel().getColumn(1).setPreferredWidth(60);
textTable.setDefaultRenderer(String.class, new RowHeightCellRenderer());

//scrollbar
JScrollPane scrollPane = new JScrollPane(textTable);

totalGUI.add(scrollPane);
return totalGUI;
}

private static void createAndShowGUI() {

//create main frame
JFrame mainFrame = new JFrame("");
ExampleTable test = new ExampleTable();

JPanel totalGUI = new JPanel();
totalGUI = test.createTable();

//visible mode
mainFrame.add(totalGUI); //integrate main panel to main frame
mainFrame.pack();
mainFrame.setVisible(true);
}


public static void main (String[] args) {

createAndShowGUI();

}//main
}

在这里您将看到对给定单元格的每个文本进行换行的代码

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


public class RowHeightCellRenderer extends JTextArea implements TableCellRenderer
{
/**
*
*/
private static final long serialVersionUID = 1L;

public Component getTableCellRendererComponent (JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column ) {
setText( value.toString() );
return this;
}
}

谢谢,但我想根据字符串长度动态实现 RowHeight...我想阅读单元格中的整个字符串/文本。有什么建议吗?

我是 Java 初学者,这是我的第一个问题。我会很高兴得到答案。

最佳答案

使用 JTextArea 作为呈现组件时存在几个问题(如果不是全部,大多数问题已经在本网站的几个 QA 中进行了解释)。尝试总结它们:

根据渲染组件的尺寸要求调整个别行高

基本上,要走的路是根据需要遍历单元格,然后

  • 用数据配置它的渲染器
  • 向渲染组件询问其首选尺寸
  • 设置表格行高为pref高度

OP 编辑​​问题中的 updateRowHeight 方法就可以了。

JTextArea 对其 preferredSize 的计算

要获得一个维度的合理大小提示,需要在另一个维度中“播种”一些合理的大小。也就是说,如果我们想要高度,它需要一个宽度,并且必须在每次调用中完成。在表格的上下文中,合理的宽度是当前列的宽度:

public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
... // configure visuals
setText((String) value);
setSize(table.getColumnModel().getColumn(column).getWidth(),
Short.MAX_VALUE);
return this;
}// getTableCellRendererComponent

动态调整高度

它在表/列/模型的某个稳定状态下完全确定的行高。所以你在初始化完成后设置它(调用updateRowHeight)一次,只要它依赖的任何状态发生变化。

// TableModelListener
@Override
public void tableChanged(TableModelEvent e) {
updateRowHeights();
}

// TableColumnModelListener
@Override
public void columnMarginChanged(ChangeEvent e) {
updateRowHeights();
}

注意事项

作为一般规则,getXXRendererComponent 中的所有参数都是严格只读的,实现不得更改调用者的任何状态。从渲染器中更新 rowHeight 是错误的

关于java - 如何在 JTable 中动态设置 RowHeight,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21723025/

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