带有自定义渲染器的JList

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带有自定义渲染器的JList相关的知识,希望对你有一定的参考价值。

我有一个显示多个JPanel的JList,我创建了一个返回新JPanel的自定义渲染器。 JPanels显示在JList中,但是它们无法访问,我无法选择它们,如果我有一个按钮或文本区域,我就无法按下它。我想尝试,如果这在JList中工作,因为我想做进一步的分页。我设法通过向Jscroll窗格添加面板来使其工作,但是希望使JList工作正常。

谢谢

答案

这是JList(和JTabelJComboBox等)的正常行为。

您的自定义渲染器返回的JPanel未添加到Swing层次结构中。 paint仅使用其JList方法,将渲染器绘制在正确的位置。渲染器只是一个标记,你在JList中看到的不是组件,而是组件的图像。

这是在屏幕上显示许多组件的有效方式,而没有真实实例化组件的开销。请注意,您的渲染器可以始终返回相同的实例(甚至更可取)。

有关详细信息,请参阅Swing tutorial

如果您希望JList的条目像真实组件一样,您可以执行以下操作。首先,使用JTable而不是JList。有一列但没有标题的JTableJList大致相同。为什么要使用JTable?因为JTable提供编辑。编辑在JTable上注册,就像Renderers一样。当用户点击JTable的单元格时,通常会出现编辑器。编辑器叠加在渲染器上,这次它是一个真正的组件。如果渲染器和编辑器组件相同,则用户感觉JTable的单元是真实组件。

Swing tutorial有这种技术的例子。

另一答案

我不能选择它们,如果我有一个按钮或文本区域,我不能按它

渲染器只是一个组件的绘画。它不是一个真正的组件,因此您不能单击按钮或在文本区域中输入文本。

您需要使用真实组件。因此,最好使用组件创建自定义面板,然后将面板添加到已添加到滚动窗格的另一个面板。

另一答案

这是我的解决方案:

public class AccountRenderer extends DefaultListCellRenderer {

private static final long serialVersionUID = 1L;

@Override
public Component getListCellRendererComponent(JList list, Object value,
        int index, boolean isSelected, boolean cellHasFocus) {
    JLabel renderer = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
    if (value != null) {
        Account entry = (Account) value;
        renderer.setText(entry.getName());
    }
    return renderer;
}

}

以上是关于带有自定义渲染器的JList的主要内容,如果未能解决你的问题,请参考以下文章

来自 xaml 的自定义渲染器的 Xamarin 访问属性

带有顶点/片段着色器的光。使用不同的变量。 (openGL)

csharp C# - Xamarin.Forms自定义简单徽章视图+通过自定义渲染器的圆角框视图

如何在片段着色器中进行自定义模板测试

GLSL/C++:自定义着色器的默认行为

带有复选框和自定义适配器的 ListView,片段无法正常工作