java 自定义 jpanel_在JList中使用自定义JPanel组件 - java
我需要显示带有名为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相关推荐
- java 自定义监听_Spring 中的自定义事件
Spring 中的自定义事件 编写和发布自己的自定义事件有许多步骤.按照在这一章给出的说明来编写,发布和处理自定义 Spring 事件. 步骤 描述 1 创建一个名称为SpringExample的项目 ...
- java引入外部字体_Java中如何自定义字体文件(引用外部字体)?-字体文件
图源来自网络 有时候我们在程序中,会使用到Java字体,但不是所有的字体系统中都会有,我们就可能会使用外部自定义字体,这样在程序迁移部署中就会少些工作,最近在一个项目中使用到了自定义字体文件,理顺了, ...
- java 获取自定义参数类型_Springboot中使用自定义参数注解获取 token 中用户数据...
使用自定义参数注解获取 token 中User数据 使用背景 在springboot项目开发中需要从token中获取用户信息时通常的方式要经历几个步骤 拦截器中截获token TokenUtil工具类 ...
- 自定义的类型转换器中怎样自定义错误消息?(待解答)
1.HTTP没有"类型"的概念,每一项表单输入只可能是一个字符串或一个字符串数组.从HTML表单到服务器端,必须把String转换为特定的数据类型. 2.字符串和基本数据类型之间的 ...
- activiti自定义_在Activiti中执行自定义查询
activiti自定义 (这可能最终会出现在Activiti 5.15版本的用户指南中,但是我已经想要共享它了) Activiti API允许使用高级API与数据库进行交互. 例如,对于检索数据,查询 ...
- android studio 自定义字体,Android Studio中的自定义字体
如何在android studio中创建自定义字体? 我试图使用自定义字体,我读过,我想将字体放在资产/字体. 我已经搜索了很长时间,但很难找到帮助. 我哪里错了?我真的不知道该怎么做. 我写下了所有 ...
- php 模板 自定义函数调用,thinkphp模板中使用自定义函数
注意:自定义函数要放在项目应用目录/common/common.php中. 这里是关键. 模板变量的函数调用格式:{$varname|function1|function2=arg1,arg2,### ...
- android自定义进度条_Android中的自定义进度栏
android自定义进度条 Custom progress bar in android application gives it a personal touch. In this tutorial ...
- android 中自定义安装,Android开发中ListView自定义adapter的封装
[引入] 我们一般编写listView的时候顺序是这样的: •需要展示的数据集List •为这个数据集编写一个ListView •为这个ListView编写一个Adapter,一般继承自BaseAda ...
最新文章
- JQuery利用css()修改样式后 hover失效的解决办法
- 65. Valid Number
- 使用Python连接数据库的脚本
- 让C68平台“冷又静”
- BUUCTF Web [强网杯 2019]随便注
- matlab偶极矩电场强度分布图_课程设计用MATLAB模拟偶极子的电场分布.doc
- 我的成长笔记20210330(测试空闲期)
- mySQL数据库学习的一些心得
- php格式化 货币,php – 使用numberFormatter格式化货币
- 大厂都搞不定的安全难题,被这家初创公司破解了!
- 行为树 --- [3] BehaviorTree.CPP在Windows下的使用(基于VSCode)
- MongoDB创建数据库
- 山东科技大学计算机控制系统期末考试试卷,山东科技大学 计算机操作系统试题b...
- 计算机语言学考研考什么,语言学及应用语言学考研有哪些内容-考研经验
- R语言如何绘制韦恩图(6)
- python:http.server --- HTTP 服务器
- 达人篇:3.3)六西格玛
- 基础知识之----------IO流(1)
- preg_match 的用法
- vista系统下载镜像_在Vista中生成系统运行状况报告
热门文章
- 阿里云 语音通知 语音验证码 收不到 白名单
- 关系数据库规范化理论
- matlab模拟塞曼图谱,C.基于LabVIEW的塞曼效应虚拟仿真-中国高等学校实验物理教学研究会.ppt...
- 共阴数码管C语言单片机,51单片机直接驱动共阴极数码管
- 微信JS接口安全域名填写ip地址
- 免费谷歌卫星地图下载器
- PCB板上的字母代表哪些元器件?一文看全!
- hihocoder-1051,codeforces-884A(C语言+注释)
- border定义不同边框,虚线边框(dashed,dotted),实线边框(solid)
- H5案例分享—你的数学是语文老师教的吗?