如何替换Java自定义DefaultTableModel中String数组的指定字符
解决方案
要实现将列名中的$$替换为tipologiaSconto变量的值,需要调整列名的初始化逻辑(原columnNames是静态常量,无法在实例化时动态修改),具体实现如下:
关键修改点
- 将原静态常量列名改为模板数组,保留
$$作为占位符; - 在构造方法中动态生成新的列名数组,替换占位符为
tipologiaSconto的值; - 用修改后的列名数组初始化父类
DefaultTableModel; - 修正原代码中的大小写错误(
defaultTableModel改为DefaultTableModel),并补充缺失的getConsentiModificaDescrizione()方法。
修改后的完整代码
import javax.swing.table.DefaultTableModel; import java.util.HashMap; public class MyTableModelScontriniArticoli extends DefaultTableModel { // 列名模板,保留$$作为占位符 private static final String[] BASE_COLUMN_NAMES = {"Cod.Prod.", "Descrizione", "Qta","Prezzo cad.","Sconto $$","Prezzo Tot"}; public HashMap<String, ArticoliScontrini> mappaArticoli = new HashMap<>(); public Boolean gestisciTagliaColore; private Boolean consentiModificaDescrizione; private String tipologiaSconto; public MyTableModelScontriniArticoli(boolean gestisciTagliaColore, boolean consentiModificaDescrizione, String tipologiaSconto) { // 克隆模板数组,避免修改原常量 String[] modifiedColumnNames = BASE_COLUMN_NAMES.clone(); // 遍历替换占位符,空值处理避免空指针 String replacement = tipologiaSconto != null ? tipologiaSconto : ""; for (int i = 0; i < modifiedColumnNames.length; i++) { modifiedColumnNames[i] = modifiedColumnNames[i].replace("$$", replacement); } // 用修改后的列名初始化父类 super(modifiedColumnNames, 1); this.gestisciTagliaColore = gestisciTagliaColore; this.consentiModificaDescrizione = consentiModificaDescrizione; this.tipologiaSconto = tipologiaSconto; } public MyTableModelScontriniArticoli(String[] columnnames2, int i) { super(columnnames2, 1); } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { if (this.consentiModificaDescrizione != null && this.consentiModificaDescrizione) { return columnIndex > 0 && columnIndex <= 4; } else { return columnIndex > 1 && columnIndex <= 4; } } // 补充缺失的getter方法,适配原代码中的调用 public Boolean getConsentiModificaDescrizione() { return consentiModificaDescrizione; } }
说明
- 使用
clone()复制模板数组,保证原静态模板不被修改; - 增加了
tipologiaSconto的空值判断,防止替换时出现NullPointerException; - 修正了原代码中
defaultTableModel的大小写错误(Java类名需大写开头); - 补充了
getConsentiModificaDescrizione()方法,解决原代码中编译报错的问题。
内容的提问来源于stack exchange,提问作者bircastri
相关产品推荐
相关产品推荐

