gpt4 book ai didi

java - 如何使用 SwingX 的荧光笔返回不同的渲染器组件?

转载 作者:行者123 更新时间:2023-11-30 03:38:45 27 4
gpt4 key购买 nike

我注意到 SwingX 的 Highlighter 接口(interface)允许荧光笔返回与传入的组件不同的组件。我实际上找不到任何使用此组件的示例,但我想我会尝试用它来创建某种假的第二列。

预期的结果是左列中的文本应截断右列开始的位置,因此我不能只使用 Painter。右列应该为整个列表呈现相同的宽度,这是一个我还没有弄清楚的问题,但看起来并不难。

就目前而言,我发现行高被压缩得非常小,你看不到任何文本。

这就是我的意思:

screenshot

示例程序:

import java.awt.BorderLayout;
import java.awt.Component;

import javax.swing.DefaultListModel;
import javax.swing.GroupLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.LayoutStyle;
import javax.swing.SwingUtilities;

import org.jdesktop.swingx.JXList;
import org.jdesktop.swingx.decorator.AbstractHighlighter;
import org.jdesktop.swingx.decorator.ComponentAdapter;
import org.jdesktop.swingx.renderer.JRendererLabel;
import org.jdesktop.swingx.renderer.StringValue;

public class RendererTest implements Runnable
{
public static void main(String[] args)
{
SwingUtilities.invokeLater(new RendererTest());
}

@Override
public void run()
{
JFrame frame = new JFrame("Highlighter test");
JXList list = new JXList();
DefaultListModel<String> listModel = new DefaultListModel<>();
listModel.addElement("one");
listModel.addElement("two");
listModel.addElement("three");
list.setModel(listModel);
list.setVisibleRowCount(8);
list.setPrototypeCellValue("some string");
list.addHighlighter(new AddSecondColumnHighlighter(v -> ((String) v).toUpperCase()));
JScrollPane listScroll = new JScrollPane(list);
frame.setLayout(new BorderLayout());
frame.add(listScroll, BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
}

private static class AddSecondColumnHighlighter extends AbstractHighlighter
{
private final StringValue secondColumnStringValue;

public AddSecondColumnHighlighter(StringValue secondColumnStringValue)
{
this.secondColumnStringValue = secondColumnStringValue;
}

@Override
protected Component doHighlight(Component component, ComponentAdapter adapter)
{
JRendererLabel rightColumn = new JRendererLabel();
rightColumn.setText(secondColumnStringValue.getString(adapter.getValue()));

return new FixedSecondColumnRendererLabel(component, rightColumn);
}
}

private static class FixedSecondColumnRendererLabel extends JRendererLabel
{
private FixedSecondColumnRendererLabel(Component leadingComponent, Component trailingComponent)
{
GroupLayout layout = new GroupLayout(this);
setLayout(layout);

layout.setHorizontalGroup(layout.createSequentialGroup()
.addComponent(leadingComponent, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
.addComponent(trailingComponent));

layout.setVerticalGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
.addComponent(leadingComponent)
.addComponent(trailingComponent));
}
}

}

我想知道是否有正确的方法来使用这部分 API。我特意扩展了 JRendererLabel 以防出现问题,但它似乎更微妙......

最佳答案

如果您查看JRendererLabel,您将看到invalidaterevalidatevalidate(以及一堆其他方法)已被设置为“无操作”,这意味着它们不再向布局管理器发出应该布局组件的通知。这样做是为了帮助提高将渲染器“标记”到组件(JXList)上的性能。

相反,请使用从 JPanel 扩展 FixedSecondColumnRendererLabel

您应该考虑对其进行优化,以便返回相同的实例,而不是每次调用该方法时都创建 FixedSecondColumnRendererLabelJRendererLabel 的新实例。每次调用该方法时都会进行配置。

请记住,此方法会为 JXList 中的每一行调用,您拥有的越多,调用它的次数就越多,它创建的短命对象就越多...

关于java - 如何使用 SwingX 的荧光笔返回不同的渲染器组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27239771/

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