Java Jtable中有一个键和多个值的hashmap?

Java Jtable中有一个键和多个值的hashmap?,java,swing,jtable,hashmap,Java,Swing,Jtable,Hashmap,可以用一个键和多个值实现hashmap,如 Map<Object,ArrayList<Object>> multiMap = new HashMap<Object,ArrayList<Object>>(); Map multiMap=newhashmap(); 在Jtable中?我有这样一个hashmap,但我只能填充两行…例如,您可以使用不同的数据多次输出同一个键 键1:数据1 关键1:数据2 然后将相同的密钥分组。有关如何设置分组模型的详细

可以用一个键和多个值实现hashmap,如

Map<Object,ArrayList<Object>> multiMap = new HashMap<Object,ArrayList<Object>>();
Map multiMap=newhashmap();

在Jtable中?我有这样一个hashmap,但我只能填充两行…

例如,您可以使用不同的数据多次输出同一个键

键1:数据1
关键1:数据2


然后将相同的密钥分组。有关如何设置分组模型的详细信息,请参阅。

键只能与
对象映射。但您始终可以将
对象添加到
数组列表中作为值显示

Map<Object,ArrayList<Object>> multiMap = new HashMap<Object,ArrayList<Object>>();
Object key ;//key to be searched
Object value ;
 if(multiMap.get(key)==null){    
   ArrayList<Object> arObj = new ArrayList<Object>();
   arObj.add(value);
   multiMap.put(key,arObj);
 }
 else{
   multiMap.get(key).add(value);
}
Map multiMap=newhashmap();
对象键//要搜索的密钥
目标价值;
如果(multiMap.get(key)==null){
ArrayList arObj=新的ArrayList();
增加(价值);
multiMap.put(key,arObj);
}
否则{
multiMap.get(key).add(value);
}
我有这样一个hashmap,但我只能填充两行

您的TableModel有问题

下面是一个使用以下内容的示例:

Map<Integer, Map<Integer, Object>> data = new HashMap<Integer, HashMap<Integer, Object>>();
Map data=newhashmap();
作为TableModel的数据存储:

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;

public class TableSparse extends JPanel
{
    public TableSparse(int row, int column)
    {
        setLayout( new BorderLayout() );

        TableModel model = new SparseTableModel(row, column);
        JTable table = new JTable(model);
        table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
        JScrollPane scrollPane = new JScrollPane( table );
        add( scrollPane );

        model.setValueAt("one", 0, 0);
        model.setValueAt("two", 5, 5);
    }

    class SparseTableModel extends AbstractTableModel
    {
        Map<Integer, Map<Integer, Object>> data = new HashMap<Integer, Map<Integer, Object>>();
        int rows;
        int columns;

        public SparseTableModel(int rows, int columns)
        {
            this.rows = rows;
            this.columns = columns;
        }

        @Override
        public int getRowCount() { return rows; }

        @Override
        public int getColumnCount() { return columns; }

        @Override
        public boolean isCellEditable(int row, int column) { return true; }

        @Override
        public Object getValueAt(int row, int column)
        {
            //  Check for row

            Integer key = new Integer(row);
            Map<Integer, Object> rows = data.get(key);

            if (rows == null) return null;

            //  Now check for column

            key = new Integer(column);
            return rows.get(key);
        }

        @Override
        public void setValueAt(Object value, int row, int column)
        {
            //  Remove cell data

            if (value.toString().equals(""))
            {
                removeCellData(row, column);
                return;
            }

            //  Save cell data

            Integer key = new Integer(row);
            Map<Integer, Object> rows = data.get(key);

            if (rows == null)
            {
                rows = new HashMap<Integer, Object>();
                data.put(key, rows);
            }

            key = new Integer(column);
            rows.put(key, value);
        }

        private void removeCellData(int row, int column)
        {
            Integer rowKey = new Integer(row);
            Map<Integer, Object> rows = data.get(rowKey);

            if (rows == null) return;

            Integer columnKey = new Integer(column);
            rows.remove(columnKey);

            if (rows.isEmpty())
                data.remove(rowKey);
        }

    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.add( new TableSparse(100, 256) );
        frame.setSize(600, 600);
        frame.setVisible(true);
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
    }
}
import java.awt.*;
导入java.awt.event.*;
导入java.util.*;
导入javax.swing.*;
导入javax.swing.table.*;
公共类表解析扩展了JPanel
{
公共表解析(int行,int列)
{
setLayout(新的BorderLayout());
TableModel model=新的SparseTableModel(行、列);
JTable table=新的JTable(模型);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
JScrollPane scrollPane=新的JScrollPane(表);
添加(滚动窗格);
model.setValueAt(“一”,0,0);
型号:setValueAt(“2”,5,5);
}
类SparseTableModel扩展了AbstractTableModel
{
映射数据=新的HashMap();
int行;
int列;
公共SparseTableModel(int行、int列)
{
this.rows=行;
this.columns=列;
}
@凌驾
public int getRowCount(){返回行;}
@凌驾
public int getColumnCount(){return columns;}
@凌驾
公共布尔值isCellEditable(int行,int列){return true;}
@凌驾
公共对象getValueAt(int行,int列)
{
//查看行
整数键=新整数(行);
映射行=data.get(键);
if(rows==null)返回null;
//现在检查列
键=新的整数(列);
返回行。get(键);
}
@凌驾
public void setValueAt(对象值,int行,int列)
{
//删除单元格数据
if(value.toString().equals(“”)
{
removeCellData(行、列);
返回;
}
//保存单元格数据
整数键=新整数(行);
映射行=data.get(键);
if(行==null)
{
行=新HashMap();
data.put(键,行);
}
键=新的整数(列);
rows.put(键、值);
}
私有void removeCellData(int行,int列)
{
整数行键=新整数(行);
映射行=data.get(rowKey);
if(rows==null)返回;
Integer columnKey=新的整数(列);
行。删除(列键);
if(rows.isEmpty())
数据删除(rowKey);
}
}
私有静态void createAndShowGUI()
{
JFrame=新JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(新表解析(100256));
框架。设置尺寸(600600);
frame.setVisible(true);
}
公共静态void main(字符串[]args)
{
invokeLater(新的Runnable()
{
公开募捐
{
createAndShowGUI();
}
});
}
}

您应该能够修改代码,以便对模型数据使用ArrayList的HashMap。

您所说的“刚好能够填充2行…”是什么意思?很好的示例+1个用于;也请考虑<代码> map < /COD>。@ TrasHead,这是我躺在周围的旧代码(从我第一次学习自定义TabelMelDelm的时候开始),实际上我今天早些时候尝试更新代码,使用泛型代码<代码> MAP<代码>,但是我得到了一个我无法解决的错误。在你的提示下,我又看了一眼,意识到我误读了错误,所以我的问题解决了。代码已更新。谢谢你的鼓励:)