Java 试图将图标和字符串并排放置在JTextArea中

Java 试图将图标和字符串并排放置在JTextArea中,java,swing,icons,jtextarea,Java,Swing,Icons,Jtextarea,我试图在JavaSwing中动态地放置项目图标。例如,如果它有三个错误,我想在星体内部,在它旁边放一个数字和一个字符串。 像这样: 我试过一些方法,但似乎不可能 是否有人猜测这是否可能,或者如何做到 谢谢 我可以用例子来做。 但我只能在java外部创建带有数字的imageItem,然后迭代它们,使其与地图中的文本匹配 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import jav

我试图在JavaSwing中动态地放置项目图标。例如,如果它有三个错误,我想在星体内部,在它旁边放一个数字和一个字符串。 像这样:

我试过一些方法,但似乎不可能

是否有人猜测这是否可能,或者如何做到

谢谢

我可以用例子来做。 但我只能在java外部创建带有数字的imageItem,然后迭代它们,使其与地图中的文本匹配

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Font;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import javax.swing.BorderFactory;
import javax.swing.DefaultListCellRenderer;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;



public class Ex extends JFrame {

    private static Map<String, ImageIcon> imageMap;
    private static JScrollPane scrollPane;
    private Color color_bg_azul = new Color(3, 109, 175);
    private Color color_bg_oops = new Color(154, 210, 232);
    private final Font f =  new Font("Tahoma", Font.PLAIN, 18);

    public static void main(String[] args) {
        new Ex();
    }

    @SuppressWarnings({ "unchecked", "serial" })
    public Ex() {
        Container c = getContentPane();

        ArrayList<String> nameList = new ArrayList<String>();
        nameList.add("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor");
        nameList.add("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do r");
        nameList.add("Lorem ipsum dolor sit amet, consectetur adipiscing elit eiusmod tempor");
        nameList.add("Lorem ipsum dolor sit amet, consectetur do eiusmod tempor");
        nameList.add("Lorem dolor sit amet, consectetur do eiusmod tempor");

        imageMap = createImageMap(nameList);
        String[] a =  new String[nameList.size()];
        JList list = new JList(nameList.toArray(a)) {
            @Override
            public boolean getScrollableTracksViewportWidth() {
                return true;
            }
        };

        list.setBackground(color_bg_oops);
        list.setCellRenderer(new ImgListRenderer());

        ComponentListener l = new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent e) {
                list.setFixedCellHeight(10);
                list.setFixedCellHeight(-1);
            }

        };
        list.addComponentListener(l);

        scrollPane = new JScrollPane();
        scrollPane.setViewportView(list);
        c.add(scrollPane);
        setSize(300, 300);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    private Map<String, ImageIcon> createImageMap(ArrayList<String> list) {
        Map<String, ImageIcon> map = new HashMap<>();

        for (int i = 0; i < list.size(); i++) {
            int aux = i+1;
            map.put(list.get(i), new ImageIcon(
                    getClass().getResource("/imgs/" + "icon-06-item-"+aux+ ".png")));
        }
        return map;
    }

    public class ImgListRenderer extends DefaultListCellRenderer {
        private JPanel p;
        private JPanel iconPanel;
        private JLabel lbl_icon;
        private JTextArea ta;

        public ImgListRenderer() {
            p = new JPanel();
            p.setLayout(new BorderLayout());

            // icon
            iconPanel = new JPanel(new BorderLayout());
            iconPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10));
            iconPanel.setBackground(color_bg_oops);
            lbl_icon = new JLabel(); // <-- this will be an icon instead of a
            // text
            iconPanel.add(lbl_icon, BorderLayout.EAST);
            p.add(iconPanel, BorderLayout.WEST);

            // text
            ta = new JTextArea();
            ta.setLineWrap(true);
            ta.setFont(f);
            ta.setWrapStyleWord(true);
            ta.setBackground(color_bg_oops);
            ta.setForeground(color_bg_azul);
            p.add(ta, BorderLayout.CENTER);
        }

        @SuppressWarnings("rawtypes")
        @Override
        public Component getListCellRendererComponent(final JList list,
                final Object value, final int index, final boolean isSelected,
                final boolean hasFocus) {

            lbl_icon.setIcon(imageMap.get((String) value));
            ta.setText((String) value);
            int width = list.getWidth();
            if (width > 0)
                ta.setSize(width, Short.MAX_VALUE);
            return p;

        }
    }
}
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Component;
导入java.awt.Container;
导入java.awt.Font;
导入java.awt.event.ComponentAdapter;
导入java.awt.event.ComponentEvent;
导入java.awt.event.ComponentListener;
导入java.util.ArrayList;
导入java.util.HashMap;
导入java.util.Map;
导入javax.swing.BorderFactory;
导入javax.swing.DefaultListCellRenderer;
导入javax.swing.ImageIcon;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JList;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTextArea;
公共类Ex扩展了JFrame{
私有静态地图;
私有静态JScrollPane滚动窗格;
私有颜色=新颜色(3,109,175);
私有颜色颜色=新颜色(154210232);
私有最终字体f=新字体(“Tahoma”,Font.PLAIN,18);
公共静态void main(字符串[]args){
新Ex();
}
@抑制警告({“未选中”、“串行”})
公共行政人员(){
容器c=getContentPane();
ArrayList nameList=新的ArrayList();
姓名列表。添加(“Lorem ipsum Door sit amet,Concetetur Adipising elit,sed do eiusmod Temporal”);
姓名列表。添加(“Lorem ipsum Door sit amet,Concertetur Adipising elit,sed do r”);
姓名列表。添加(“Lorem ipsum dolor sit amet,Concetetur Adipising elit eiusmod Temporal”);
姓名列表。添加(“Lorem ipsum Door sit amet,Concertetur do eiusmod Temporal”);
姓名列表。添加(“Lorem dolor sit amet,Concertetur do eiusmod tempor”);
imageMap=createImageMap(名称列表);
String[]a=新字符串[nameList.size()];
JList list=新JList(nameList.toArray(a)){
@凌驾
公共布尔值getScrollableTracksViewportWidth(){
返回true;
}
};
列表。挫折背景(彩色背景);
setCellRenderer(新的ImgListRenderer());
ComponentListener l=新的ComponentAdapter(){
@凌驾
公共无效组件已恢复(组件事件e){
列表。设置固定单元高度(10);
列表。设置固定单元高度(-1);
}
};
list.addComponentListener(l);
scrollPane=新的JScrollPane();
scrollPane.setViewportView(列表);
c、 添加(滚动窗格);
设置大小(300300);
setVisible(真);
setDefaultCloseOperation(关闭时退出);
}
私有映射createImageMap(ArrayList列表){
Map Map=newhashmap();
对于(int i=0;i

我知道这不是最好的方法,但对我来说很有效。希望有帮助

到目前为止你试过什么?让我们看看!这与jTextarea有什么关系?
jTextarea
不会这样做,
JTextPane
JEditorPane
可以,但您最好使用
JList
甚至一系列
JLabel