我自己的偏好是使用列表的模型来做到这一点。就像是:
DefaultListModel model = (DefaultListModel)jList1.getModel();
File temp = model.remove(jList1.getSelectedIndex());
model.add(0, temp);
要查看列表模型可用的方法,请查看DefaultListModel API。
编辑:代码工作正常。
编辑 2:我的sscce
import java.awt.event.ActionEvent;
import javax.swing.*;
public class TestList {
private static void createAndShowGui() {
String[] data = {"Mon", "Tues", "Wed", "Thurs", "Fri", "Sat", "Sun"};
final DefaultListModel<String> model = new DefaultListModel<String>();
for (String datum : data) {
model.addElement(datum);
}
final JList<String> myList = new JList<String>(model);
JButton toTop = new JButton(new AbstractAction("To Top") {
@Override
public void actionPerformed(ActionEvent arg0) {
int selectedIndex = myList.getSelectedIndex();
if (selectedIndex < 0) {
return;
}
String temp = model.remove(selectedIndex);
model.add(0, temp);
}
});
JPanel mainPanel = new JPanel();
mainPanel.add(new JScrollPane(myList));
mainPanel.add(toTop);
JFrame frame = new JFrame("TestList");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
如果您在查看此内容后仍然遇到问题,请考虑阅读有关SSCCE的内容,并在此处发布您自己的内容,我们可以对其进行修改和更正。
编辑 3
根据我们在聊天中的讨论,
您的问题是当您调用 To Top JButton 时,您正在从列表中删除所选项目,而 ListSelectionListener 仍在侦听,这将导致抛出 NPE。一种可能的解决方案是在删除或添加任何项目之前删除 ListSelectionListener,然后在执行这些操作后重新添加侦听器。当您更新列表模型时,这可能是必要的。请在下面查看我的SSCCE。还可以了解阅读和理解 SSCCE 代码如何比您的大代码更容易。
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.event.*;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.event.*;
@SuppressWarnings("serial")
public class MyToolView extends JPanel {
public File[] file;
public static int i = 0;
final static JFileChooser fc = new JFileChooser();
private static final int PREF_W = 900;
private static final int PREF_H = 750;
final DefaultListModel listModel = new DefaultListModel();
final JList myList = new JList(listModel);
private JLabel imageLabel = new JLabel();
private javax.swing.JButton openButton;
private JButton toTopBtn;
private javax.swing.JList imageJList;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JPanel mainPanel;
public MyToolView() {
initComponents();
}
private void initComponents() {
jScrollPane1 = new javax.swing.JScrollPane();
imageJList = new javax.swing.JList(listModel);
openButton = new javax.swing.JButton();
toTopBtn = new JButton("To Top");
JPanel topPanel = new JPanel();
topPanel.add(jScrollPane1);
topPanel.add(openButton);
topPanel.add(toTopBtn);
setLayout(new BorderLayout());
add(topPanel, BorderLayout.PAGE_START);
add(new JScrollPane(imageLabel), BorderLayout.CENTER);
toTopBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
toTopBtnActionPerformed(e);
}
});
jScrollPane1.setFocusable(false);
jScrollPane1.setName("jScrollPane1"); // NOI18N
imageJList.setModel(new javax.swing.AbstractListModel() {
String[] strings = { "AAAA.JPG", "BBBB.JPG" };
public int getSize() {
return strings.length;
}
public Object getElementAt(int i) {
return strings[i];
}
});
imageJList.setName("jList1"); // NOI18N
imageJList.setCellRenderer(new JavaRenderer());
jScrollPane1.setViewportView(imageJList);
imageJList.addListSelectionListener(listSelectionListener);
openButton.setFocusable(false);
openButton.setName("openButton"); // NOI18N
openButton.setAction(new OpenAction("Open"));
}
@Override
public Dimension getPreferredSize() {
return new Dimension(PREF_W, PREF_H);
}
private void toTopBtnActionPerformed(java.awt.event.ActionEvent evt) {
// ******** here **********
imageJList.removeListSelectionListener(listSelectionListener);
int selectedIndex = imageJList.getSelectedIndex();
if (selectedIndex < 0) {
return;
}
String temp = (String) listModel.remove(selectedIndex);
listModel.add(0, temp);
// ******** here **********
imageJList.addListSelectionListener(listSelectionListener);
}
ListSelectionListener listSelectionListener = new ListSelectionListener() {
public void valueChanged(ListSelectionEvent listSelectionEvent) {
System.out.print("First index: " + listSelectionEvent.getFirstIndex());
System.out.print(", Last index: " + listSelectionEvent.getLastIndex());
String path = (String) imageJList.getSelectedValue();
System.out.println("path should be here: " + path);
Image img;
try {
System.out.println("path is null: " + (path == null));
File imageFile = new File(path);
img = ImageIO.read(imageFile);
imageLabel.setIcon(new ImageIcon(img));
imageLabel.setText("");
} catch (IOException ex) {
ex.printStackTrace();
}
}
};
private class OpenAction extends AbstractAction {
public OpenAction(String text) {
super(text);
}
public void actionPerformed(ActionEvent evt) {
fc.setMultiSelectionEnabled(true);
int returnVal = fc.showDialog(null, "Open");
int len = 0;
if (returnVal == JFileChooser.APPROVE_OPTION) {
imageJList.removeListSelectionListener(listSelectionListener); //!!
file = fc.getSelectedFiles();
len = file.length;
System.out.println("length = " + len);
// this code should be inside the if block
for (i = 0; i < len; i++) {
String path = file[i].getPath();
System.out.printf("%d: %s%n", i, path);
listModel.add(i, path);
}
imageJList.setModel(listModel);
imageJList.addListSelectionListener(listSelectionListener); //!!
}
// imageJList.updateUI(); //!! you shouldn't call this.
}
}
private static void createAndShowGui() {
MyToolView mainPanel = new MyToolView();
JFrame frame = new JFrame("MyToolView");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
class JavaRenderer extends DefaultListCellRenderer {
private int a;
@Override
public Component getListCellRendererComponent(JList jList1, Object value,
int index, boolean isSelected, boolean hasFocus) {
if (value instanceof String) {
String name = (String) value;
String[] splitedArray = null;
splitedArray = name.split("\\\\");
a = splitedArray.length - 1;
name = splitedArray[a];
System.out.println("name " + name);
return super.getListCellRendererComponent(jList1, name, index,
isSelected, hasFocus);// what we display
} else {
return super.getListCellRendererComponent(jList1, value, index,
isSelected, hasFocus);// what we take
}
}
}