Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 倾听JTable更改_Java_Swing_Jtable - Fatal编程技术网

Java 倾听JTable更改

Java 倾听JTable更改,java,swing,jtable,Java,Swing,Jtable,我有一个名为Model的类,我想将其表示为JTable,我通过将AbstractTableModel子类化实现了这一点。 我的问题是如何监听数据中的更改并更新我的模型,我查阅了许多教程,发现它们实现了TableModelListener并使用void tableChanged()方法,但这不适用于,所以我无法进入tableChanged()方法并执行我想要的操作。 取而代之的是进入setValueAt()方法,并在其中实现了我想要的逻辑,它成功了 但我必须用空代码实现TableModelList

我有一个名为Model的类,我想将其表示为JTable,我通过将AbstractTableModel子类化实现了这一点。 我的问题是如何监听数据中的更改并更新我的模型,我查阅了许多教程,发现它们实现了TableModelListener并使用void tableChanged()方法,但这不适用于,所以我无法进入tableChanged()方法并执行我想要的操作。 取而代之的是进入setValueAt()方法,并在其中实现了我想要的逻辑,它成功了 但我必须用空代码实现TableModelListener接口及其方法tableChanged(),我不明白为什么。 我想我在理解tableListener如何工作时遇到了问题

    package model;

import java.util.ArrayList;

import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;

public class ModelsTable extends AbstractTableModel implements TableModelListener
{
    private String[] columnNames = { "Model",
                    "mac start", "mac end",
                    "host start", "host end",
                    "dn start" , "dn end",
                    "sn start" , "sn end"};

    private ModelsDictionary dictionary = ModelsDictionary.getModelsDictionary();
    public ModelsTable() 
    {
        this.addTableModelListener(this);

    }

    public void fireTableCellUpdated(int row, int col)
    {
        System.out.println(row + "" + col);
    }

    @Override
    public int getColumnCount() 
    {
        return columnNames.length;
    }
    @Override
    public int getRowCount() 
    {
        return dictionary.getAllModels().size();
    }
    public String getColumnName(int col) 
    {
        return columnNames[col];
   }
     @Override
     public void setValueAt(Object aValue, int row, int col) 
     {
         System.out.println(row + " " + col);
         Model model = dictionary.getAllModels().get(row);
         Model newModel;

         if(col == 0) 
         {
        newModel = new Model((String)aValue,model.getMacStart(),model.getMacEnd(),model.getHostStart(),model.getHostEnd(),model.getDnStart(),model.getDnEnd(),model.getSnStart(),model.getSnEnd());
             dictionary.updateModel(model,newModel);
         }
         else if(col == 1)
         {
             newModel = new Model(model.getNumber(),(String)aValue,model.getMacEnd(),model.getHostStart(),model.getHostEnd(),model.getDnStart(),model.getDnEnd(),model.getSnStart(),model.getSnEnd());
             dictionary.updateModel(model,newModel);
         }
         else if(col == 2)
         {
             newModel = new Model(model.getNumber(),model.getMacStart(),(String)aValue,model.getHostStart(),model.getHostEnd(),model.getDnStart(),model.getDnEnd(),model.getSnStart(),model.getSnEnd());
             dictionary.updateModel(model,newModel);
         }
         else if(col == 3)
         {
             newModel = new Model(model.getNumber(),model.getMacStart(),model.getMacEnd(),(String)aValue,model.getHostEnd(),model.getDnStart(),model.getDnEnd(),model.getSnStart(),model.getSnEnd());
             dictionary.updateModel(model,newModel);
         }
         else if(col == 4)
         {
             newModel = new Model(model.getNumber(),model.getMacStart(),model.getMacEnd(),model.getHostStart(),(String)aValue,model.getDnStart(),model.getDnEnd(),model.getSnStart(),model.getSnEnd());
             dictionary.updateModel(model,newModel);
         }
         else if(col == 5)
         {
             newModel = new Model(model.getNumber(),model.getMacStart(),model.getMacEnd(),model.getHostStart(),model.getHostEnd(),(String)aValue,model.getDnEnd(),model.getSnStart(),model.getSnEnd());
             dictionary.updateModel(model,newModel);
         }
         else if(col == 6)
         {
             newModel = new Model(model.getNumber(),model.getMacStart(),model.getMacEnd(),model.getHostStart(),model.getHostEnd(),model.getDnStart(),(String)aValue,model.getSnStart(),model.getSnEnd());
             dictionary.updateModel(model,newModel);
         }
         else if(col == 7)
         {
             newModel = new Model(model.getNumber(),model.getMacStart(),model.getMacEnd(),model.getHostStart(),model.getHostEnd(),model.getDnStart(),model.getDnEnd(),(String)aValue,model.getSnEnd());
             dictionary.updateModel(model,newModel);
         }
         else if(col == 8)
         {
             newModel = new Model(model.getNumber(),model.getMacStart(),model.getMacEnd(),model.getHostStart(),model.getHostEnd(),model.getDnStart(),model.getDnEnd(),model.getSnStart(),(String)aValue);
             dictionary.updateModel(model,newModel);
         }      
     }
    @Override
    public Object getValueAt(int x, int y) 
    {

         Model model = dictionary.getAllModels().get(x);

         switch(y) {
         case 0:
              return model.getNumber();
         case 1:
              return model.getMacStart();
         case 2:
              return model.getMacEnd();
         case 3:
              return model.getHostStart();
         case 4:
              return model.getHostEnd();
         case 5:
             return model.getDnStart();
         case 6:
             return model.getDnEnd();
         case 7:
             return model.getSnStart();
         case 8: 
             return model.getSnStart();
         default:
             return "unknown";

         }
    }
    public boolean isCellEditable(int row, int col) 
    {
        return true;
    }

    @Override
    public void tableChanged(TableModelEvent event) 
    {
        System.out.println("lol");
        int row = event.getFirstRow();
        int column = event.getColumn();
        ModelsTable model = (ModelsTable)event.getSource();
        String columnName = model.getColumnName(column);
        Model data = (Model) model.getValueAt(row, column);
        System.out.println(model);
    }
}
这是我显示其中JTable的面板 包视图

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.util.ArrayList;

import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;

import Control.InteractiveTableModelListener;

import model.Model;
import model.ModelsDictionary;
import model.ModelsTable;
import net.miginfocom.swing.MigLayout;

public class AllModelsPanel extends JPanel 
{

    private boolean DEBUG = false;
    public AllModelsPanel()
    {
         super(new GridLayout(1, 0));

         ArrayList<Model> models = ModelsDictionary.getModelsDictionary().getAllModels();
         JTable table = new JTable();
         table.setModel(new ModelsTable());
         table.setPreferredScrollableViewportSize(new Dimension(500, 70));
         table.setFillsViewportHeight(true);

         JScrollPane scrollPane = new JScrollPane(table);
         add(scrollPane);


    }



}
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.GridLayout;
导入java.util.ArrayList;
导入javax.swing.JLabel;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.JPanel;
导入javax.swing.JTextArea;
导入javax.swing.event.TableModelEvent;
导入javax.swing.event.TableModelListener;
导入控件.InteractiveTableModelListener;
导入模型;
导入model.ModelsDictionary;
导入model.ModelsTable;
导入net.miginfocom.swing.MigLayout;
公共类AllModelsPanel扩展了JPanel
{
私有布尔调试=false;
公共AllModelsPanel()
{
超级(新网格布局(1,0));
ArrayList models=ModelsDictionary.getModelsDictionary().getAllModels();
JTable table=新的JTable();
表.setModel(新的ModelsTable());
表.setPreferredScrollableViewportSize(新维度(500,70));
表.setFillsViewPerthweight(真);
JScrollPane scrollPane=新的JScrollPane(表);
添加(滚动窗格);
}
}
这是我的ModelsDictionary类,它聚合模型类来添加诸如读/写DB或文件之类的功能 **注意:我使用的是singelton设计模式

package model;
import java.io.File;
import java.util.ArrayList;




import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;


public class ModelsDictionary 
{

    private static ModelsDictionary myInstance;
    private ArrayList<Model> models = new ArrayList<Model>();
    private ArrayList<String> modelNumbers = new ArrayList<String>();


    private ModelsDictionary()
    {
        readXMLfile();
    }
    public static ModelsDictionary getModelsDictionary()
    {
        if (myInstance == null )
        {
            synchronized(ModelsDictionary.class)
            {
                if( myInstance == null)
                {
                    myInstance = new ModelsDictionary();
                }
            }
        }
        return myInstance;
    }

    public void addModel(Model model)
    {
        models.add(model);
        modelNumbers.add(model.getNumber());
        writeXMLfile();
    }
    public void deleteModel(Model model)
    {
        models.remove(model);
        modelNumbers.remove(model.getNumber());
    }
    public void updateModel(Model oldModel, Model newModel)
    {
        int index = models.indexOf(oldModel);
        System.out.println("index" + index);
        models.set(index, newModel);
        writeXMLfile();
    }
    public Model getModel(String modelNumber)
    {
        //System.out.println("getModels ,,,, models size: " +models.size());
        for(Model model: models)
        {
            //System.out.println("in models");
            if(model.getNumber().equals(modelNumber))
            {
                //System.out.println("model number matched");
                return model;
            }
        }
        return null;
    }
    public ArrayList<Model> getAllModels()
    {
        return models;
    }
    public ArrayList<String> getAllModelNumbers()
    {
        return modelNumbers;
    }
    public void readXMLfile()
    {
        models = new ArrayList<Model>();
        try 
        {
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            File file = new File("models.xml");
            if(file.exists())
            {
                Document doc = dBuilder.parse(file);
                doc.getDocumentElement().normalize();
                NodeList nList = doc.getElementsByTagName("Model");
                for (int i = 0; i < nList.getLength(); i++)
                {
                    Node nNode = nList.item(i);
                    if (nNode.getNodeType() == Node.ELEMENT_NODE) 
                    {
                        Element eElement = (Element)nNode;
                        String number = eElement.getElementsByTagName("Number").item(0).getTextContent();
                        String macStart = eElement.getElementsByTagName("MacStart").item(0).getTextContent();
                        String macEnd = eElement.getElementsByTagName("MacEnd").item(0).getTextContent();
                        String hostStart = eElement.getElementsByTagName("HostStart").item(0).getTextContent();
                        String hostEnd = eElement.getElementsByTagName("HostEnd").item(0).getTextContent();
                        String snStart = eElement.getElementsByTagName("SnStart").item(0).getTextContent();
                        String snEnd = eElement.getElementsByTagName("SnEnd").item(0).getTextContent();
                        String dnStart = eElement.getElementsByTagName("DnStart").item(0).getTextContent();
                        String dnEnd = eElement.getElementsByTagName("DnEnd").item(0).getTextContent();

                        Model model = new Model(number);
                        model.setMacPatt(macStart, macEnd);
                        model.setDnPatt(dnStart, dnEnd);
                        model.setSnPatt(snStart, snEnd);
                        model.setHostPatt(hostStart, hostEnd);
                        addModel(model);    
                    }
                 }
            }

        } 
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
    public void writeXMLfile()
    {
        try
        {
                DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
                DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
                Document doc = docBuilder.newDocument();

                Element rootElement = doc.createElement("Models");
                doc.appendChild(rootElement);
                for(Model model : models)
                {
                    Element m = doc.createElement("Model");
                    rootElement.appendChild(m);


                    Element number = doc.createElement("Number");
                    number.setTextContent(model.getNumber());
                    m.appendChild(number);


                    Element macStart = doc.createElement("MacStart");
                    macStart.setTextContent(model.getMacStart());
                    m.appendChild(macStart);

                    Element macEnd = doc.createElement("MacEnd");
                    macEnd.setTextContent(model.getMacEnd());
                    m.appendChild(macEnd);

                    Element hostStart = doc.createElement("HostStart");
                    hostStart.setTextContent(model.getHostStart());
                    m.appendChild(hostStart);

                    Element hostEnd = doc.createElement("HostEnd");
                    hostEnd.setTextContent(model.getHostEnd());
                    m.appendChild(hostEnd);

                    Element dnStart = doc.createElement("DnStart");
                    dnStart.setTextContent(model.getDnStart());
                    m.appendChild(dnStart);

                    Element dnEnd = doc.createElement("DnEnd");
                    dnEnd.setTextContent(model.getDnEnd());
                    m.appendChild(dnEnd);

                    Element snStart = doc.createElement("SnStart");
                    snStart.setTextContent(model.getSnStart());
                    m.appendChild(snStart);

                    Element snEnd = doc.createElement("SnEnd");
                    snEnd.setTextContent(model.getSnEnd());
                    m.appendChild(snEnd);
                }
                TransformerFactory transformerFactory = TransformerFactory.newInstance();
                Transformer transformer = transformerFactory.newTransformer();
                transformer.setOutputProperty(OutputKeys.INDENT, "yes");
                transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
                DOMSource source = new DOMSource(doc);
                File file = new File("models.xml");
                StreamResult result = new StreamResult(file);

                transformer.transform(source, result);

        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}
包模型;
导入java.io.File;
导入java.util.ArrayList;
导入javax.xml.parsers.DocumentBuilder;
导入javax.xml.parsers.DocumentBuilderFactory;
导入javax.xml.transform.OutputKeys;
导入javax.xml.transform.Transformer;
导入javax.xml.transform.TransformerFactory;
导入javax.xml.transform.dom.DOMSource;
导入javax.xml.transform.stream.StreamResult;
导入org.w3c.dom.Document;
导入org.w3c.dom.Element;
导入org.w3c.dom.Node;
导入org.w3c.dom.NodeList;
公共类模型字典
{
私有静态模型dictionary myInstance;
私有ArrayList模型=新ArrayList();
private ArrayList modelNumbers=new ArrayList();
私有模型字典()
{
readXMLfile();
}
公共静态模型dictionary getModelsDictionary()
{
if(myInstance==null)
{
已同步(ModelsDictionary.class)
{
if(myInstance==null)
{
myInstance=new ModelsDictionary();
}
}
}
返回myInstance;
}
公共模型(模型)
{
模型。添加(模型);
modelNumbers.add(model.getNumber());
writeXMLfile();
}
公共模型(模型)
{
模型。移除(模型);
modelNumbers.remove(model.getNumber());
}
public void updateModel(模型旧模型、模型新模型)
{
int index=models.indexOf(旧模型);
系统输出打印项次(“索引”+索引);
models.set(索引,newModel);
writeXMLfile();
}
公共模型getModel(字符串模型编号)
{
//System.out.println(“getModels,,,,models size:+models.size());
用于(模型:模型)
{
//System.out.println(“在模型中”);
if(model.getNumber().equals(modelNumber))
{
//System.out.println(“匹配的型号”);
收益模型;
}
}
返回null;
}
公共ArrayList getAllModels()
{
收益模型;
}
公共阵列列表getAllModelNumbers()
{
返回型号;
}
public void readXMLfile()
{
models=newarraylist();
尝试
{
DocumentBuilderFactory dbFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder=dbFactory.newDocumentBuilder();
File File=新文件(“models.xml”);
if(file.exists())
{
Document doc=dBuilder.parse(文件);
doc.getDocumentElement().normalize();
NodeList nList=doc.getElementsByTagName(“模型”);
对于(int i=0;i     @Override
     public void setValueAt(Object aValue, int row, int col) 
     {
          //your default code here
           and then you should call 
           fireTableRowsUpdated(row,row); // if you change the row
           OR
           fireTableCellUpdated(row,col); // if you change the cell
           OR
           fireTableDataChanged(); // if you change all the model  

     }