我在这里遇到问题,我在这里创建了一个actionListener,用于创建一个随机人,并将其添加到JList以显示在JScrollPane上。到目前为止,一切都很顺利,只要我点击JButton添加一个新人,JList不会添加到当前列表,而是每次都替换它,因此Jlist上只显示一个项目。我知道问题出在哪里,你会立即在行动事件中看到它。无论如何,感谢任何帮助我的朋友!
private static final JTextArea PlayerList = new JTextArea(30, 100);
private JList newbie;
private List<Human> members = new ArrayList<Human>();
private JTextArea Area;
private String[] listString;
private String[] newString;
private ArrayList<String> list = new ArrayList<String>();
private ArrayList<String> zz = new ArrayList<String>();
public JTabbedPaneFrame() throws FileNotFoundException
{
super("JTabbedPane Demo");
JTabbedPane tabbedPane = new JTabbedPane();
JPanel Gladiator = new JPanel();
getContentPane().add(Gladiator);
/////////////Tabbed Pane Gladiator///////////////////
tabbedPane.addTab("Gladiator", null, Gladiator, "");
Box ListOfPlayers = Box.createVerticalBox();
ListOfPlayers.add(Box.createRigidArea(new Dimension(100,100)));
ListOfPlayers.setBorder(new TitledBorder("List of Players"));
Area = new JTextArea(20, 15);
Area.setLineWrap(true);
Area.setWrapStyleWord(false);
final JList newbie = new JList();
JScrollPane PlayerViewer = new JScrollPane(newbie);
PlayerViewer.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
ListOfPlayers.add(PlayerViewer);
Gladiator.add(ListOfPlayers);
/////////////Vertical Box between Text and Tabbed Profile//////
Box Randomer = Box.createVerticalBox();
Randomer.setBorder(new TitledBorder("Randomize or Add Gladiator"));
JButton AddIndividual = new JButton("Add a Player");
Randomer.add(AddIndividual);
Gladiator.add(Randomer);
AddIndividual.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
String x = "";
String y = "";
String z = "";
String ee = "";
ArrayList<String> listx = new ArrayList<String>();
ArrayList<String> zzx = new ArrayList<String>();
JList newbiex;
Human temp;
try {
temp = new Human();
x = temp.toString();
y = temp.getSurname();
z = temp.getFirstName();
listx.add(x);
ee = String.format(y + ", " + z );
zzx.add(ee);
listString = new String[zzx.size()];
listString = zzx.toArray(listString);
newbiex = new JList(zzx.toArray());
newbie.setModel(newbiex.getModel());
members.add(temp);
for(String W: listString) /////testing diff method here////
{
Area.append(W);
}
}
catch (FileNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
add(tabbedPane);
/////////////Action Buttons////////////////////
}
}
类HumanRenderer扩展了DefaultListCellRenderer
{
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
JLabel label = new JLabel();
if (value != null) {
Human human = (Human) value;
label.setText(human.getSurname() + ", " + human.getFirstName());
}
return label;
}
}
答案 0 :(得分:1)
您正在JList
中创建一个新的newbiex
ActionListener
,但您永远不会将其添加到JFrame
。而是重复使用原始JList
newbie
并将新Human
添加到其模型中。使用可变的DefaultListModel
。
DefaultListModel<Human> model = new DefaultListModel<>();
JList<Human> newbie = new JList<>(model);
您需要一个自定义单元格渲染器才能在Human
中显示JList
个对象。见Writing a Custom Cell Renderer
class HumanRenderer extends DefaultListRenderer {
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
JLabel label = new JLabel();
if (value != null) {
Human human = (Human) value;
label.setText(human.getSurName() + ", " + human.getFirstName());
}
return label;
}
}
答案 1 :(得分:0)
你在这里做了很多奇怪的事情。
您似乎每次单击时都创建一个JList,在其中添加Human并将初始模型的列表设置为新创建的列表模型。
为了简化您生成包含最后添加的人类的新模型,并将其用作列表的新模型。
唯一要做的就是将新的Human添加到EXISTING模型中,因此您必须保留对此模型的引用。
您可以在Java教程中找到更多详细信息:http://docs.oracle.com/javase/tutorial/uiswing/components/list.html