我需要显示带有名为Item的自定义JPanel组件的JList。这些组件具有唯一的标识name。它们可以动态添加到JList中,也可以更新(如果已经存在)。我尝试以下实现,但它只会生成一个空的JList。请指教。

class Item extends JPanel {

JLabel name = new JLabel(" ");

JLabel col1 = new JLabel(" ");

JLabel col2 = new JLabel(" ");

Item(){

setMinimumSize(new Dimension(100, 20));

setLayout(new BorderLayout());

add(name, BorderLayout.WEST);

add(col1, BorderLayout.CENTER);

add(col2, BorderLayout.EAST);

}

}

public class Test_List extends JFrame {

private final JList list = new JList(new Item[0]);

HashMap map = new HashMap();

Test_List(){

setTitle("Test JList");

setLayout(new BorderLayout());

add(new JScrollPane(list), BorderLayout.CENTER);

pack();

}

public void update_item(String name, String s1, String s2){

Item item = map.get(name);

if (item == null){ // add new

item = new Item();

item.name.setText(name);

map.put(name, item);

list.add(item);

}

item.col1.setText(s1);

item.col2.setText(s2);

}

public static void main(String s[]) {

final Test_List frame = new Test_List();

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

SwingUtilities.invokeLater(new Runnable() {

@Override

public void run() {

frame.setVisible(true);

}

});

frame.update_item("A", "a", "aa"); // add new item

frame.update_item("B", "b", "bb"); // add new item

frame.update_item("A", "aa", "a"); // update existing item

}

}

参考方案

模型负责对数据建模,因为它永远不应该包含UI特定的信息,因为模型不关心显示方式,它负责转换数据,因此可以确认是否符合视图/模型协定ListModel合同。

首先看一下Writing a Custom Cell Renderer

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.Component;

import java.awt.Dimension;

import java.awt.EventQueue;

import javax.swing.DefaultListModel;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JList;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.ListCellRenderer;

import javax.swing.UIManager;

import javax.swing.UnsupportedLookAndFeelException;

import javax.swing.border.Border;

import javax.swing.border.EmptyBorder;

public class TestListCellRenderer {

public static void main(String[] args) {

new TestListCellRenderer();

}

public TestListCellRenderer() {

EventQueue.invokeLater(new Runnable() {

@Override

public void run() {

try {

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {

ex.printStackTrace();

}

DefaultListModel model = new DefaultListModel();

model.addElement(new Item("A", "a", "aa"));

model.addElement(new Item("B", "b", "bb"));

model.addElement(new Item("C", "c", "cc"));

model.addElement(new Item("D", "d", "dd"));

JList list = new JList(model);

list.setCellRenderer(new ItemCellRenderer());

JFrame frame = new JFrame("Testing");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.add(new JScrollPane(list));

frame.pack();

frame.setLocationRelativeTo(null);

frame.setVisible(true);

}

});

}

public static class Item {

private String name;

private String col1;

private String col2;

public Item(String name, String col1, String col2) {

this.name = name;

this.col1 = col1;

this.col2 = col2;

}

public String getCol1() {

return col1;

}

public String getCol2() {

return col2;

}

public String getName() {

return name;

}

}

public static class ItemCellRenderer extends JPanel implements ListCellRenderer{

private static final Border SAFE_NO_FOCUS_BORDER = new EmptyBorder(1, 1, 1, 1);

private static final Border DEFAULT_NO_FOCUS_BORDER = new EmptyBorder(1, 1, 1, 1);

protected static Border noFocusBorder = DEFAULT_NO_FOCUS_BORDER;

JLabel name = new JLabel(" ");

JLabel col1 = new JLabel(" ");

JLabel col2 = new JLabel(" ");

public ItemCellRenderer() {

setLayout(new BorderLayout());

add(name, BorderLayout.WEST);

add(col1, BorderLayout.CENTER);

add(col2, BorderLayout.EAST);

}

@Override

public Dimension getMinimumSize() {

return new Dimension(100, 20);

}

@Override

public Dimension getPreferredSize() {

return getMinimumSize();

}

protected Border getNoFocusBorder() {

Border border = UIManager.getBorder("List.cellNoFocusBorder");

if (System.getSecurityManager() != null) {

if (border != null) return border;

return SAFE_NO_FOCUS_BORDER;

} else {

if (border != null &&

(noFocusBorder == null ||

noFocusBorder == DEFAULT_NO_FOCUS_BORDER)) {

return border;

}

return noFocusBorder;

}

}

@Override

public Component getListCellRendererComponent(JList extends Item> list, Item value, int index, boolean isSelected, boolean cellHasFocus) {

setComponentOrientation(list.getComponentOrientation());

Color bg = null;

Color fg = null;

JList.DropLocation dropLocation = list.getDropLocation();

if (dropLocation != null

&& !dropLocation.isInsert()

&& dropLocation.getIndex() == index) {

bg = UIManager.getColor("List.dropCellBackground");

fg = UIManager.getColor("List.dropCellForeground");

isSelected = true;

}

if (isSelected) {

setBackground(bg == null ? list.getSelectionBackground() : bg);

setForeground(fg == null ? list.getSelectionForeground() : fg);

} else {

setBackground(list.getBackground());

setForeground(list.getForeground());

}

name.setText(value.getName());

col1.setText(value.getCol1());

col2.setText(value.getCol2());

name.setForeground(getForeground());

col1.setForeground(getForeground());

col2.setForeground(getForeground());

setEnabled(list.isEnabled());

name.setFont(list.getFont());

col1.setFont(list.getFont());

col2.setFont(list.getFont());

Border border = null;

if (cellHasFocus) {

if (isSelected) {

border = UIManager.getBorder("List.focusSelectedCellHighlightBorder");

}

if (border == null) {

border = UIManager.getBorder("List.focusCellHighlightBorder");

}

} else {

border = getNoFocusBorder();

}

setBorder(border);

return this;

}

}

}

说了这么多,我认为使用JTable会更好,请参见How to Use Tables

当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? - java

我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…Java-父类正在从子类中调用方法? - java

抱歉,我还是编码的新手,可能还没有掌握所有术语。希望您仍然能理解我的问题。我想得到的输出是:"Cost for Parent is: 77.77" "Cost for Child is: 33.33" 但是,我得到这个:"Cost for Parent is: 33.33" "Cost f…java.net.URI.create异常 - java

java.net.URI.create("http://adserver.adtech.de/adlink|3.0") 抛出java.net.URISyntaxException: Illegal character in path at index 32: http://adserver.adtech.de/adlink|3.0 虽然n…Java-固定大小的列表与指定初始容量的列表之间的差异 - java

我在理解这一点上遇到了问题。当我们做 List list = Arrays.asList(array); 我们不能在该列表上使用添加,删除之类的方法。我知道Arrays.asList()返回固定大小的列表。我不明白的是,如果我们创建一个具有指定初始容量的列表,例如List list2 = new A…我正在尝试从用户那里获取输入并将其传输到文本文件 - java

我正在尝试编写一个聊天机器人,以便从用户那里学到答案,为此,我需要将答案保存到一个文本文件中,稍后再阅读。在代码中,它允许我编写问题,然后不创建文本文件并给出错误。有人可以告诉我我在做什么错。谢谢所有帮助。public static void main(String[] args) { // TODO Auto-generated method stub S…

java 自定义 jpanel_在JList中使用自定义JPanel组件 - java相关推荐

  1. java 自定义监听_Spring 中的自定义事件

    Spring 中的自定义事件 编写和发布自己的自定义事件有许多步骤.按照在这一章给出的说明来编写,发布和处理自定义 Spring 事件. 步骤 描述 1 创建一个名称为SpringExample的项目 ...

  2. java引入外部字体_Java中如何自定义字体文件(引用外部字体)?-字体文件

    图源来自网络 有时候我们在程序中,会使用到Java字体,但不是所有的字体系统中都会有,我们就可能会使用外部自定义字体,这样在程序迁移部署中就会少些工作,最近在一个项目中使用到了自定义字体文件,理顺了, ...

  3. java 获取自定义参数类型_Springboot中使用自定义参数注解获取 token 中用户数据...

    使用自定义参数注解获取 token 中User数据 使用背景 在springboot项目开发中需要从token中获取用户信息时通常的方式要经历几个步骤 拦截器中截获token TokenUtil工具类 ...

  4. 自定义的类型转换器中怎样自定义错误消息?(待解答)

    1.HTTP没有"类型"的概念,每一项表单输入只可能是一个字符串或一个字符串数组.从HTML表单到服务器端,必须把String转换为特定的数据类型. 2.字符串和基本数据类型之间的 ...

  5. activiti自定义_在Activiti中执行自定义查询

    activiti自定义 (这可能最终会出现在Activiti 5.15版本的用户指南中,但是我已经想要共享它了) Activiti API允许使用高级API与数据库进行交互. 例如,对于检索数据,查询 ...

  6. android studio 自定义字体,Android Studio中的自定义字体

    如何在android studio中创建自定义字体? 我试图使用自定义字体,我读过,我想将字体放在资产/字体. 我已经搜索了很长时间,但很难找到帮助. 我哪里错了?我真的不知道该怎么做. 我写下了所有 ...

  7. php 模板 自定义函数调用,thinkphp模板中使用自定义函数

    注意:自定义函数要放在项目应用目录/common/common.php中. 这里是关键. 模板变量的函数调用格式:{$varname|function1|function2=arg1,arg2,### ...

  8. android自定义进度条_Android中的自定义进度栏

    android自定义进度条 Custom progress bar in android application gives it a personal touch. In this tutorial ...

  9. android 中自定义安装,Android开发中ListView自定义adapter的封装

    [引入] 我们一般编写listView的时候顺序是这样的: •需要展示的数据集List •为这个数据集编写一个ListView •为这个ListView编写一个Adapter,一般继承自BaseAda ...

最新文章

  1. JQuery利用css()修改样式后 hover失效的解决办法
  2. 65. Valid Number
  3. 使用Python连接数据库的脚本
  4. 让C68平台“冷又静”
  5. BUUCTF Web [强网杯 2019]随便注
  6. matlab偶极矩电场强度分布图_课程设计用MATLAB模拟偶极子的电场分布.doc
  7. 我的成长笔记20210330(测试空闲期)
  8. mySQL数据库学习的一些心得
  9. php格式化 货币,php – 使用numberFormatter格式化货币
  10. 大厂都搞不定的安全难题,被这家初创公司破解了!
  11. 行为树 --- [3] BehaviorTree.CPP在Windows下的使用(基于VSCode)
  12. MongoDB创建数据库
  13. 山东科技大学计算机控制系统期末考试试卷,山东科技大学 计算机操作系统试题b...
  14. 计算机语言学考研考什么,语言学及应用语言学考研有哪些内容-考研经验
  15. R语言如何绘制韦恩图(6)
  16. python:http.server --- HTTP 服务器
  17. 达人篇:3.3)六西格玛
  18. 基础知识之----------IO流(1)
  19. preg_match 的用法
  20. vista系统下载镜像_在Vista中生成系统运行状况报告

热门文章

  1. 阿里云 语音通知 语音验证码 收不到 白名单
  2. 关系数据库规范化理论
  3. matlab模拟塞曼图谱,C.基于LabVIEW的塞曼效应虚拟仿真-中国高等学校实验物理教学研究会.ppt...
  4. 共阴数码管C语言单片机,51单片机直接驱动共阴极数码管
  5. 微信JS接口安全域名填写ip地址
  6. 免费谷歌卫星地图下载器
  7. PCB板上的字母代表哪些元器件?一文看全!
  8. hihocoder-1051,codeforces-884A(C语言+注释)
  9. border定义不同边框,虚线边框(dashed,dotted),实线边框(solid)
  10. H5案例分享—你的数学是语文老师教的吗?