在上一节中我们利用ListCellRenderer interface在JList中加入Icon图像,而要在JComboBox中加入图像的方法也是一样的。
我们必须实作ListCellRenderer interface所定义的方法getListCellRendererComponent.以下为这个方法的定义:
要先了解ListCellRenderer interface.我们必须由这个interface所定义的方法,将图像画在JComboBox中的每个项目。
ListCellRenderer interface里只定义了一个方法,那就是getListCellRendererComponent,不过这个参数有点多,我们把它列出来
看看:
public Component getListCellRendererComponent(JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus)
list:即所要画上的图像的JComboBox组件。
value:JComboBox项目值,如JComboBox.getModel().getElementAt(index)所返回的值。
index:为JComboBox项目的索引值,由0开始。
isSelected与cellHasFocus:判断JComboBox中的项目是否有被选取或是有焦点置入。
上面这4个参数会在你设置JComboBox的绘图样式(setCellRenderer())时自动的由JComboBox组件提供,你只要关心怎么控制
getListCellRendererComponent()方法中的4个参数,而无需担心怎么参数传入。
要在JList中加入Icon图像的技巧就是将JComboBox中的每一个项目当作是JLabel,因为JLabel在使用文字与图像上非常的方便,要设置JComboBox的图像,
必须使用setRenderer(ListCellRenderer cellRenderer){注:我们在JList中画上图像是利用JList所提供的setCellRenderer(ListCellRenderer
cellRenderer)方法,读者请小心}这个方法。我们来看下面这个范例,你就能明白了!
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class JComboBox4{
String[] s={"西瓜","苹果","草莓","香蕉","葡萄"};
public JComboBox4(){
JFrame f=new JFrame("JComboBox");
Container contentPane=f.getContentPane();
JComboBox combo=new JComboBox(s);
combo.setBorder(BorderFactory.createTitledBorder("你最喜欢吃哪些水果?"));
combo.setRenderer(new ACellRenderer());
combo.setMaximumRowCount(3);
contentPane.add(combo);
f.pack();
f.show();
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
}
public static void main(String[] args){
new JComboBox4();
}
}
class ACellRenderer extends JLabel implements ListCellRenderer{
ACellRenderer(){
setOpaque(true);
}
public Component getListCellRendererComponent(JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus){
if (value!=null){
setText(value.toString());
setIcon(new ImageIcon(".\\icons\\fruit"+(index+1)+".jpg"));
}
if (isSelected){
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
}else{
setBackground(list.getBackground());
setForeground(list.getForeground());
}
return this;
}
}
各们读者在运行这个程序时会发现,即使JComboBox的选项中有图标,但在选后图标却不会显示在显示列中,原因是在上面程序中
我们以String Array s建立JComboBox:
JComboBox combo=new JComboBox(s);
String Array s里面放的只是水果名称,而并没有图标。当我们使用setRenderer()方法来JComboBox时,只会绘制JComboBox的
选项部份,而最后显示在JComboBox上的值还是以String Array s为依据。因此JComboBox显示列就只会显示文字而已,而不会显示出
图形。要解决这个问题,我们必须改变JComboBox所传入的参数内容,也就是将原来的String Array s更改成具有图形的数据项。在
此我们是利用JComboBox(Object[] items)来建立有图像的JComboBox,我们所传进去的Object Array不应该只有文字,而必须连图标一
并传入。我们修改上个范例修改如下:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class JComboBox5
{
String[] s = {"西瓜","苹果","草莓","香蕉","葡萄"};
ImageIcon[] icons = new ImageIcon[5];;
public JComboBox5()
{
JFrame f = new JFrame("JComboBox");
Container contentPane = f.getContentPane();
ItemObj[] obj = new ItemObj[5];
for(int i=0; i < 5; i++)
{
icons[i] = new ImageIcon(".\\icons\\fruit"+(i+1)+".jpg");
obj[i] = new ItemObj(s[i],icons[i]);
}
JComboBox combo = new JComboBox(obj);//利用ItemObj Array obj当作是JComboBox的参数传入,构造出JComboBox.
combo.setBorder(BorderFactory.createTitledBorder("您喜欢吃哪些水果?"));
combo.setRenderer(new ACellRenderer());
combo.setMaximumRowCount(3);
contentPane.add(combo);
f.pack();
f.show();
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String args[])
{
new JComboBox5();
}
}
class ItemObj
{
String name;
ImageIcon icon;
public ItemObj(String name, ImageIcon icon){
this.name = name;
this.icon = icon;
}
}
class ACellRenderer extends JLabel implements ListCellRenderer
{
ACellRenderer()
{
setOpaque(true);
}
public Component getListCellRendererComponent(JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus)
{
if (value != null)
{
setText(((ItemObj)value).name);
setIcon(((ItemObj)value).icon);
}
if (isSelected) {
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
}
else {
setBackground(list.getBackground());
setForeground(list.getForeground());
}
return this;
}
}
你可以发现,第一栏显示有图标显示出来了。当然你也可以利用ComboBoxModel方式来构造出有图标的JComboBox.我们来看下面
的例子:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class JComboBox6{
String[] s={"西瓜","苹果","草莓","香蕉","葡萄"};
ImageIcon[] icons=new ImageIcon[5];
public JComboBox6(){
JFrame f=new JFrame("JComboBox");
Container contentPane=f.getContentPane();
for(int i=0; i < 5; i++)
{
icons[i] = new ImageIcon(".\\icons\\fruit"+(i+1)+".jpg");
}
ComboBoxModel mode=new AModel();
JComboBox combo=new JComboBox(mode);
combo.setBorder(BorderFactory.createTitledBorder("您喜欢吃哪些水果?"));
combo.setRenderer(new ACellRenderer());
combo.setMaximumRowCount(3);
contentPane.add(combo);
f.pack();
f.show();
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String[] args){
new JComboBox6();
}
/*我们用JComboBox(ComboBoxModel aModel)来构造图标的JComboBox,因此我们在程序中编写一个继承DefaultComboBoxModel的
ComboBoxModel.
*/
class AModel extends DefaultComboBoxModel{
AModel(){
for (int i=0;i<s.length;i++){
ItemObj obj=new ItemObj(s[i],icons[i]);
addElement(obj);
}
}
}
}
class ItemObj
{
String name;
ImageIcon icon;
public ItemObj(String name, ImageIcon icon){
this.name = name;
this.icon = icon;
}
}
class ACellRenderer extends JLabel implements ListCellRenderer
{
ACellRenderer()
{
setOpaque(true);
}
public Component getListCellRendererComponent(JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus)
{
if (value != null)
{
setText(((ItemObj)value).name);
setIcon(((ItemObj)value).icon);
}
if (isSelected) {
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
}
else {
setBackground(list.getBackground());
setForeground(list.getForeground());
}
return this;
}
}
我们用JComboBox(ComboBoxModel aModel)来构造图标的JComboBox,因此我们在程序中编写一个继承DefaultComboBoxModel的
ComboBoxModel.
分享到:
相关推荐
这款"很漂亮的一款列表式显示数据的JAVA源码实例"提供了一个优秀的参考模板,适用于那些想要在自己的Java应用中实现类似功能的开发者。 首先,我们需要了解Java中的列表组件。在Java Swing库中,`JList`是用于显示...
在实际项目中,你还可以考虑其他因素,如列表项的渲染(通过实现`ListCellRenderer`),以及如何处理用户的点击事件(通过添加`MouseListener`或`ListSelectionListener`)。同时,为了提高性能,可能需要考虑使用...
Java生成自定义控件源代码,颜色选择下拉框演示,带图标下拉框的单元绘制器,从JLabel类扩展,实现ListCellRenderer接口,采用Object二维数组,用于初始化下拉框,参数依次为图标,显示文本,提示文本,初学者参考。
本文将介绍如何使用 JavaSwing 中的 ListCellRenderer 接口来自定义 JList 组件的外观。 一、ListCellRenderer 接口 ListCellRenderer 接口是 JavaSwing 中的一个重要接口,用于自定义 JList 和 JComboBox 组件的...
创建`JList`实例时,传入自定义的`ListModel`和`ListCellRenderer`。 ```java JList<ImageInfo> jList = new JList(new ImageListModel()); jList.setCellRenderer(new ImageRenderer()); ``` 5. **事件监听*...
首先,需要创建一个`TransferHandler`实例,并将其设置到`JList`上。接着,你需要重写`canImport()`、`importData()` 和 `exportAsDrag()` 方法来处理拖放操作的开始、结束和数据转移。这使得用户能够方便地通过拖放...
然后创建了IconList实例,并通过setCellRenderer方法设置了一个自定义的渲染器IconCellRenderer。 IconCellRenderer类扩展了JLabel并实现了ListCellRenderer接口。它包含了getListCellRendererComponent方法,这个...
这里我们将深入探讨如何使用Java来生成一个带有图标的下拉框,特别是通过扩展`JLabel`类并实现`ListCellRenderer`接口来完成这一任务。这将帮助我们理解Java GUI编程的基础,以及如何利用Swing库来定制组件。 首先...
在Java编程语言中,"实例4 彩色列表框"可能是一个特定的示例,它展示了如何在用户界面中创建和使用彩色的列表框。在Java Swing库中,我们可以使用`JList`组件来创建这样的功能。下面我们将深入探讨这个知识点。 ...
对于那些希望为列表增加更多视觉元素(如图片)的应用程序来说,使用 `ListCellRenderer` 接口可以大大增强 `JList` 的表现力。本文将详细介绍如何使用 `ListCellRenderer` 来创建一个更加美观且功能丰富的 `JList` ...
这个过程涉及到对Java Swing库的深入理解,特别是JList组件和ListCellRenderer接口。下面我们将详细解释如何在Java中创建一个包含图片的列表。 首先,`IconList` 是一个自定义的JList子类,它扩展了JList的功能,...
`JList` 还支持自定义渲染,通过实现`ListCellRenderer`接口,你可以控制列表项的外观。此外,还可以通过`setCellRenderer`方法为`JList`指定自定义渲染器。 在实际应用中,`JList` 常与`JScrollPane`一起使用,以...
首先,`JList` 默认并不支持复选框,但我们可以使用 `DefaultListModel` 和 `ListCellRenderer` 来实现这一功能。`DefaultListModel` 用于存储列表中的项,而 `ListCellRenderer` 则负责定制每个列表项的显示方式,...
根据提供的文件信息,我们可以...通过分析提供的代码片段,我们了解了如何在Java中使用`JList`和`JPopupMenu`,以及如何实现自定义的`ListCellRenderer`来美化用户界面。这些知识点对于Java开发者来说是非常实用的。
摘要:Java源码,初学实例,自定义控件 Java生成自定义控件源代码,颜色选择下拉框演示,带图标下拉框的单元绘制器,从JLabel类扩展,实现ListCellRenderer接口,采用Object二维数组,用于初始化下拉框,参数依次为图标,...
2. **渲染器**:为了正确显示选中状态,你需要自定义`ListCellRenderer`。这个渲染器将负责在下拉列表中以特定方式(例如加粗、颜色变化等)显示选中的条目。 3. **编辑器**:如果允许用户通过键盘输入,你可能还...
描述中的“重新实现了CellRenderer,可同时显示图片和文字”表明我们要讨论的是如何用自定义的`ListCellRenderer`来创建一个可以同时显示图像和文本的`JList`。`CellRenderer` 是 Swing 中的一种设计模式,它允许...
2. **自定义渲染器**:通过实现`ListCellRenderer`接口并将其设置为`JComboBox`的渲染器,可以完全控制下拉列表项的显示方式。 ```java jComboBox.setRenderer(new DefaultListCellRenderer() { @Override ...
重新实现Combobox,重新设计了ListCellRenderer的Painter 对触摸设备的支持进行了改良 把SVG也融入到Resource Editor中 本人的上传权限限制无法全部的上传资源ResourceEdit.exe没neng 没能一块上传,在下一个资源...
可以创建一个自定义的`ListCellRenderer`并将其设置到`JComboBox`上,以改变选项的展示样式。 3. **自定义模型**: 如果需要更复杂的布局或功能,可以创建一个自定义的`ComboBoxModel`,这允许添加额外的数据结构和...