我有一个C#背景,我对Java很新。尝试使用Java将我的Windows应用程序移植到Mac。
我遇到的问题是如何将包含类的HashTable绑定到JTable,以便键中的变量显示在JTable中。在C#WPF中,它非常简单,只需将GridView.ItemSource绑定到dictionary.keys即可。但在Java中,它看起来要复杂得多。以下是我到目前为止的情况:
Map<Files, String> files = new HashMap<Files,String>();
public class Files {
public Files(String files, String duration, String status) {}
}
public void AddFiles(String addfile, String addduration, String addstatus, String path){
files.put(new Files(
addfile, addduration, addstatus),
path);
}
在C#中,类看起来会有所不同,但我可以做GridView.Itemsource = files.Keys和瞧,这一切都完美地显示了upp。如何在Java中实现类似的东西?
我知道JTable可以使用多维数组来加载值,所以我现在正试图将HashTable的值加载到Object[][] tableData
然后使用:
String[] columnNames = {"File","Duration", "Status"};
final JTable table = new JTable(tableData, columnNames);
问题是我不知道如何访问HashMap“files”中“Files”类中的变量。
我知道有.getKey().getClass()
但我仍然无法使用HashMap中“Files”类的值加载多维数组。
答案 0 :(得分:1)
创建一个从基类AbstractTableModel
扩展的tableModel。在这里,你必须覆盖适当的方法(你的IDE会指出它们),最重要的是getValueAt()
。
以类似于:
的方式覆盖这一个@Override
public Object getValueAt(int rowIndex, int columnIndex) {
switch (columnIndex) {
case 0:
return data.get(rowIndex).getValueX; // Change to however you'd like to call a single value from your map
case 1:
return data.get(rowIndex).getValueY;
case 2:
return data.get(rowIndex).getValueZ;
default:
throw new IndexOutOfBoundsException();
}
}
您可以将数据作为参数调用模型。然后,使用此模型作为JTable的参数,你应该没问题。
答案 1 :(得分:0)
您可以使用keys
方法获取HashMap
的{{1}}。
这将返回您HashMap.keySet()
中存储的Set
个关键对象。
HashMap
获得该套装后,假设您将HashMap<Files, String> yourHashMap = new HashMap<Files, String>();
Set<Files> keys = yourHashMap.keySet();
设置为DefaultTableModel
,则可以这样做,
JTable
注:
总是更好使用类,它会覆盖for(Files f : keys) {
yourDefaultTableModel.addRow(new String[]{f.files, f.duration, f.status});
}
方法&amp; 不可变用作equals()
密钥。
覆盖HashMap
将避免在Hash collision之后覆盖密钥,并且使不可变类不会使与孤立>密钥相关联的值(因为密钥一旦创建就不会改变)
因此,如果您认为equals()
类不可变会破坏其目的,建议您使用HashMap<String, Files>
而不是HashMap<Files,String>
。