java jlist 设置高度_java – 根据内容展开JList行高

本文介绍了如何使用JTable和一个没有TableHeader的TableColumn来实现类似于JList的效果,尤其是在MacOS上。通过创建一个TextAreaCellRenderer,并在doLayout()方法中计算并设置合适的行高,使得文本内容可以自动换行并适应单元格的高度。
摘要由CSDN通过智能技术生成

也许有最容易和最好的方式,我认为

JTable与一个TableColumn(并且没有TableHeader)在所有情况下都更好如

JList,这是你的

Render MacOX version

那么输出应该是

import java.awt.*;

import javax.swing.*;

import javax.swing.table.*;

import javax.swing.text.*;

//http://tips4java.wordpress.com/2008/10/26/text-utilities/

public class AutoWrapTest {

public JComponent makeUI() {

String[] columnNames = {" Text Area Cell Renderer "};

Object[][] data = {

{"123456789012345678901234567890"},

{"dddddddddddddddddddddddddddddddddddddddddddddddddddddddddx"},

{"----------------------------------------------0"},

{">>>>>>>>>>>>>dddddddddddddddddddddddddddddddddddddddddddddddddd"

+ "dddddddxdddddddddddddddddddddddddddddddddddddddddddddd"

+ "dddddddddddx>>>>>>>>>>>>>>>>>>>>>>>>>|"},

{">>>>>>>>>>>>ddddddddddddddddddddddddddddddddddddddddddddddddddd"

+ "ddddddx>>>>>>>>>>>>>>>>>>>>>>>>>>|"},

{"a|"},

{">>>>>>>>bbbb>>>>>>>>>>>>>>>>>>>|"},

{">>>>>>>>>>>>>>>>>>|"},

{">>>>>>>>>>>>>dddddddddddddddddddddddddddddddddddddddddddddddddd"

+ "dddddddxdddddddddddddd123456789012345678901234567890dddddd"

+ "dddddddddddddddddddddddddddddddddddddx>>>>>>>>>>>>>>>>>>>>"

+ ">>>>>|"},

{">>>>>>>>>>>>>dddddddddddddd123456789012345678901234567890dddddd"

+ "dddddddddddddddddddddddddddddddddddddxdddddddddddddd123456"

+ "789012345678901234567890dddddddddddddddddddddddddddddddddd"

+ "ddddd123456789012345678901234567890ddddx>>>>>>>>>>>>>>>>>>"

+ ">>>>>>>|"},};

TableModel model = new DefaultTableModel(data, columnNames) {

private static final long serialVersionUID = 1L;

@Override

public boolean isCellEditable(int row, int column) {

return false;

}

};

JTable table = new JTable(model) {

private static final long serialVersionUID = 1L;

@Override

public void doLayout() {

TableColumn col = getColumnModel().getColumn(0);

for (int row = 0; row < getRowCount(); row++) {

Component c = prepareRenderer(col.getCellRenderer(), row, 0);

if (c instanceof JTextArea) {

JTextArea a = (JTextArea) c;

int h = getPreferredHeight(a) + getIntercellSpacing().height;

if (getRowHeight(row) != h) {

setRowHeight(row, h);

}

}

}

super.doLayout();

}

private int getPreferredHeight(JTextComponent c) {

Insets insets = c.getInsets();

View view = c.getUI().getRootView(c).getView(0);

int preferredHeight = (int) view.getPreferredSpan(View.Y_AXIS);

return preferredHeight + insets.top + insets.bottom;

}

};

table.setEnabled(false);

table.setShowGrid(false);

table.setTableHeader(null);

table.getColumnModel().getColumn(0).setCellRenderer(new TextAreaCellRenderer());

//table.setPreferredScrollableViewportSize(table.getPreferredSize());

JScrollPane sp = new JScrollPane(table);

sp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

sp.setPreferredSize(new Dimension(250, 533));

JPanel p = new JPanel(new BorderLayout());

p.add(sp);

return p;

}

public static void main(String[] args) {

EventQueue.invokeLater(new Runnable() {

@Override

public void run() {

createAndShowGUI();

}

});

}

public static void createAndShowGUI() {

JFrame f = new JFrame();

f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

f.getContentPane().add(new AutoWrapTest().makeUI());

f.setLocation(100, 100);

f.pack();

f.setVisible(true);

}

}

class TextAreaCellRenderer extends JTextArea implements TableCellRenderer {

private static final long serialVersionUID = 1L;

private final Color evenColor = new Color(230, 240, 255);

public TextAreaCellRenderer() {

super();

setLineWrap(true);

setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));

}

@Override

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {

if (isSelected) {

setForeground(table.getSelectionForeground());

setBackground(table.getSelectionBackground());

} else {

setForeground(table.getForeground());

setBackground(table.getBackground());

setBackground((row % 2 == 0) ? evenColor : getBackground());

}

setFont(table.getFont());

setText((value == null) ? "" : value.toString());

return this;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值