我有两个类,每个类都是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方法}}