从另一个类调用update时,不会更新JList

时间:2013-11-16 04:28:46

标签: java swing actionlistener jlist

我有两个类,每个类都是JTabbedPane的一个面板。这些类使用JTable(第一个面板)和JList(第二个面板)实现面板。任务是将选定的项目从JTable复制到JList。侦听从JTable向JList添加新项的事件的按钮位于第一个类中。我在按钮的监听器actionPerformed()中有以下代码:

int[] selection = aJTable.getSelectedRows();
for (int i = 0; i < selection.length; i++)
{
      selection[i] = aJTable.convertRowIndexToModel(selection[i]);
      String mp = (String)aJTable.getValueAt(selection[i], 0);

      // ProfileView is a singleton
      ProfileView.getInstance().getMPModelList().addElement(mp);        
}

ListModel已更新,如果我在插入新元素之前和之后打印它,新元素将添加到列表中。但是这个新项目在列表中不可见,因此列表不会更新。我使用重绘和重新验证,但它不起作用。

为什么我不能从另一个类更新列表?我实际上在第二类中有两个JLists,但第二个是通过单击同一面板上的按钮来更新,它工作得很完美,但是我不能使用相同的算法(listModel.addElement)从另一个类做同样的事情。 PMP))。

更新。第一个类的代码(使用JTable):

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.border.TitledBorder;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;


@SuppressWarnings("serial")
public class Test1 extends JPanel implements ActionListener
{
    private MPTable2 aTable = new MPTable2(); 
    private final String aTitle = "Title";
    private final Dimension aSize = new Dimension(400, 500);
    private JTable aJTable;

    public Test1()
    {
        setBorder(new TitledBorder(aTitle)); 
        setPreferredSize(aSize); 
        JPanel tablePanel = new JPanel();
        tablePanel.setVisible(true); 
        aJTable = new JTable(aTable);
        JScrollPane tableContainer = new JScrollPane(aJTable); 
        tablePanel.add(tableContainer, BorderLayout.CENTER);
        add(tablePanel, BorderLayout.CENTER); 

        JButton addButton = new JButton("Add MP"); 
        add(addButton, BorderLayout.EAST); 

        addButton.addActionListener(this); 
        aTable.fillTable();

    }

    @Override
    public void actionPerformed(ActionEvent pAction)
    {
        int[] selection = aJTable.getSelectedRows();
        for (int i = 0; i < selection.length; i++)
        {
            selection[i] = aJTable.convertRowIndexToModel(selection[i]);
            String mp = (String)aJTable.getModel().getValueAt(selection[i], 1);

            boolean added = test.getInstance().addMP(mp);
            if (added)
            {
                aTable.setValueAt("yes", selection[i], 2); 
                aJTable.repaint();
            }
        }
    }

}

@SuppressWarnings("serial")
class MPTable2 extends AbstractTableModel implements TableModelListener
{

    private final String[] aColumnNames = {
            "One", "Two", "Three", "Four"
    };
    private Object[][] aRowData;
    private int aMPNumber = 0; 


    public MPTable2()
    {
        super();
    }
    @Override
    public int getRowCount()
    {
        return aMPNumber; 
    }
    @Override
    public int getColumnCount()
    {
        return aColumnNames.length; 
    }
    public void setValueAt(Object pValue, int pRow, int pCol)
    {
        aRowData[pRow][pCol] = pValue; 
    }
    @Override
    public Object getValueAt(int pRow, int pCol)
    {
        return aRowData[pRow][pCol];
    }
    @Override
    public void tableChanged(TableModelEvent pE)
    {
        // TODO Auto-generated method stub

    }

    public void fillTable()
    {
        aMPNumber = 3;
        aRowData = new Object[aMPNumber][aColumnNames.length]; 
        int currentDataIndex; 

        for(int i = 1; i < aMPNumber; i++)
        {
            currentDataIndex = 0; 
            this.setValueAt("One", i, currentDataIndex++); 
            this.setValueAt("Two", i, currentDataIndex++); 
            this.setValueAt("Three", i, currentDataIndex++);
            this.setValueAt("Four", i, currentDataIndex++);

        }
    }
}

第二个类(使用JList):

import java.awt.BorderLayout;
import java.util.ArrayList;
import java.util.List;

import javax.swing.DefaultListModel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.ListSelectionModel;
import javax.swing.border.TitledBorder;


@SuppressWarnings("serial")
public class test extends JPanel
{
    private static final test INSTANCE = new test();
    private JList<String> aList;
    private DefaultListModel<String> aListModel;    

    public test()
    {

        setLayout(new BorderLayout());
        setBorder(new TitledBorder("TITLE")); 

        JPanel lMPPanel = buildPanel(0); 

        JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
                lMPPanel, null);
        add(splitPane, BorderLayout.CENTER);


    }

    public static test getInstance()
    {
        return INSTANCE;
    }

    public JPanel buildPanel(int pIndex)
    {
        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());

        JScrollPane spane = createListPane();
        panel.add(spane, BorderLayout.CENTER);

        return panel;
    }


    private int getIndex(String pWord, int pIndex)
    {
        int index;
        if (aListModel.size() == 0)
        {
            index = 0;
        }
        else 
        {
            int i;
            for (i = 0; i < aListModel.size(); i++)
            {
                String s = aListModel.getElementAt(i).toLowerCase();
                if (s.compareTo(pWord.toLowerCase()) > 0)
                {
                    break;
                }
            }
            index = i;
        }
        return index;
    }
    private JScrollPane createListPane()
    {
        aListModel = new DefaultListModel<String>();
        aList = new JList<String>(aListModel);

        List<String> list = new ArrayList<String>();
        list.add("1");
        list.add("2");
        list.add("3");

        for (String s : list)
            aListModel.addElement(s);

        aList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        aList.setVisibleRowCount(10);

        aList.setPrototypeCellValue("00000000000000000000000000000000000");
        JScrollPane pane = new JScrollPane(aList);


        return pane;
    }

    public boolean addMP(String pMP)
    {
        aListModel.insertElementAt(pMP, getIndex(pMP, 0));
        return true;
    }
}

主:

import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;


@SuppressWarnings("serial")
public class Test extends JFrame
{
    private Test()
    {
            setLayout(new BorderLayout()); 
            JPanel lCenterPanel = new JPanel(); 
            getContentPane().add(lCenterPanel, BorderLayout.CENTER); 

            JTabbedPane lViews = new JTabbedPane(); 
            buildViews(lViews); 
            lCenterPanel.add(lViews); 
            lCenterPanel.setOpaque(true); 


            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
            pack();  
            setLocationRelativeTo(null); 
            setVisible(true);   
        }

        private void buildViews(JTabbedPane pViews)
        {
            pViews.add("JTable", new Test1()); 
            pViews.add("JList", new test());

        }

        public static void main(String[] pArgs)
        {
            new Test();
        }
    }

仅当将类private DefaultListModel<String> aListModel的{​​{1}}设置为静态时才更新JList。

UPDATE 2。解决方法是删除Singleton模式并在构造test对象时传递test类的实例,然后在{{1}的实例上调用addMP方法}}

0 个答案:

没有答案