java - 图标没有出现在 JComboBox 中以及如何调整大小?
问题描述
目标是让图像出现在 ComobBox 中。
使用 ImageIcon 和基本调用时,除了图标非常大外,所有调用都可以正常工作。不确定组合框是否使用图标来设置大小以及是否可以更改。
使用扩展 ImageIcon 的自定义类时,不会出现图标,这是要解决的主要目标。
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import javax.swing.ImageIcon;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class JComboBoxWithIcons extends JFrame {
private static final long serialVersionUID = 1L;
private final ImageIcon ICON1a = new ImageIcon("c:\\Downloads\\Images\\Image1.jpg");
private final ImageIcon ICON2a = new ImageIcon("c:\\Downloads\\Images\\Image2.jpg");
private final ImageIcon ICON3a = new ImageIcon("c:\\Downloads\\Images\\Image3.jpg");
private final MyImageIconObject ICON1b = new MyImageIconObject("c:\\Downloads\\Images\\Image1.jpg");
private final MyImageIconObject ICON2b = new MyImageIconObject("c:\\Downloads\\Images\\Image2.jpg");
private final MyImageIconObject ICON3b = new MyImageIconObject("c:\\Downloads\\Images\\Image3.jpg");
private JComboBox comboBox1;
private JComboBox comboBox2;
private JPanel topPanel;
public JComboBoxWithIcons () {}
public void createGUI(){
setMinimumSize(new Dimension(400,400));
setTitle("Demo");
setLocation(200, 200);
topPanel = new JPanel();
getContentPane().add(topPanel, BorderLayout.CENTER);
ArrayList<ImageIcon> iconsA = new ArrayList<ImageIcon>();
iconsA.add(ICON1a);
iconsA.add(ICON2a);
iconsA.add(ICON3a);
ArrayList<MyImageIconObject> iconsB = new ArrayList<MyImageIconObject>();
iconsB.add(ICON1b);
iconsB.add(ICON2b);
iconsB.add(ICON3b);
comboBox1 = new JComboBox();
comboBox2 = new JComboBox();
for(ImageIcon val : iconsA){
comboBox1.addItem(val);
}
for(MyImageIconObject val : iconsB){
comboBox2.addItem(val);
}
topPanel.add(comboBox1);
topPanel.add(comboBox2);
super.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose();
}
});
}
public static void main(String[] args)
{
JComboBoxWithIcons T = new JComboBoxWithIcons();
T.createGUI();
T.setVisible(true);
}
class MyImageIconObject extends ImageIcon
{
float x;
ImageIcon ic;
public MyImageIconObject(String iconLocation)
{
this.ic = new ImageIcon(iconLocation);
}
@Override
public void paintIcon(Component c, Graphics g, int x, int y)
{
super.paintIcon(c, g, x, y);
// Graphics2D g2d = (Graphics2D) g;
// ic.paintIcon(c, g2d, x, y);
System.out.println("Painting 2");
}
}
}
执行上述代码时,会产生以下结果:
该示例创建了 2 个具有相同图标的组合框。
ComboBox1 - 显示图标,但它们很大。
ComboBox2 - 使用自定义类并覆盖paintIcon(),因为我计划对图标进行额外修改,但首先需要它们出现。
问题 1(更多是一个好奇的问题) - 调整图标大小是否需要渲染器?
问题 2(主要目标) - 对于 ComboBox 2,为什么没有出现图标?
解决方案
您的 MyImageIconObject 类扩展了 ImageIcon 但您不调用父类的构造函数,您只需实例化一个 ImageIcon 对象。因此,当您调用 paintIcon 方法时,父类将不知道您的 ImageIcon 对象并引用 null。
这是一个如何修复图标不显示问题的示例
class MyImageIconObject extends ImageIcon
{
float x;
public MyImageIconObject(String iconLocation)
{
super(iconLocation);
}
@Override
public void paintIcon(Component c, Graphics g, int x, int y)
{
super.paintIcon(c, g, x, y);
// Graphics2D g2d = (Graphics2D) g;
// ic.paintIcon(c, g2d, x, y);
System.out.println("Painting 2");
}
}
推荐阅读
- flutter - Flutter Chips 可点击的头像不起作用
- python - SessionNotCreatedException:消息:会话未创建:此版本的 ChromeDriver 仅支持带有 Selenium ChromeDriver 的 Chrome 版本 76
- java - 使用 Spring Boot 加载外部文件属性
- javascript - 修复一个图标,该图标可以根据平台引导您访问不同的网站
- java - Spring MongoDB:服务器在启动后立即关闭连接
- python-3.x - 在......中找不到“adb.exe”?
- mysql - MYSQL请求显示两个表的行的差异并删除考虑到行ID的重复字段
- hibernate - Spring JPA - 两种方式映射急切地获取孩子
- c# - 如何将此 PowerShell 代码转换为 C#
- c++ - 在点云项目中找不到 std::sample