English 中文(简体)
Jist: 按顶端/ Bottom 按钮排序
原标题:JList: sorting by Top/Bottom buttons

I ve got a problem connected with my previous question: JList: sorting by Up/down buttons My Up/Down buttons work properly now, but here s the other thing: I need to make Top/Bottom buttons also. They seem to be harder. I use actionPerformed to button "Top":

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
 int indexOfSelected = jList1.getSelectedIndex();
 swapElements2(indexOfSelected, 0);
 indexOfSelected = 0;
 jList1.setSelectedIndex(indexOfSelected );
 jList1.updateUI();
}

互换元素2 方法看起来是这样的:

private void swapElements2(int pos1, int pos2) {
  String tmp1 =  (String) listModel.get(pos1);
  String tmp2 =  (String) listModel.get(pos2);
  listModel = (DefaultListModel) jList1.getModel();
  int sizeOfList = listModel.getSize();

  listModel.set(pos2, listModel.get(sizeOfList-1));
  for (int i=sizeOfList-2;i>0;i--){
    listModel.set(i+1, listModel.get(i));
  }

  listModel.set(pos2, tmp1);
  listModel.set(pos2+1, tmp2);
}

当然, 它只有在选择 JJList 最后一个元素时才有效 。 是否有人知道如何使一个通用方法将元素从选定位置移动到 0 位置? 方法还应该将所有其他元素向前移动, 如果不选中, 最后元素应该留在原位 。

任何帮助我都感激不尽

从批注中编辑, 这些批注同样不起作用 :

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
 String temp = (String) listModel.remove(jList1.getSelectedIndex());
 listModel.add(0, temp);
}

错误 :

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
name podziwiaj.jpg
at java.io.File.<init>(File.java:222)

即:

public File(String pathname) {
if (pathname == null) {
    throw new NullPointerException();
}
this.path = fs.normalize(pathname);
this.prefixLength = fs.prefixLength(this.path);
}

选择项目时, 列出文件( 图像) 和显示的存储路径名 。

最佳回答

我本人更希望与列表模式合作来做到这一点。比如:

DefaultListModel model = (DefaultListModel)jList1.getModel();
File temp = model.remove(jList1.getSelectedIndex());
model.add(0, temp);

为了解列表模式可用何种方法,请查看 DefaultListModel API

编辑:代码工作正常。

Edit 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();
         }
      });
   }
}

如果你在审阅后仍然卡住, 那么考虑阅读 < a href=> "http://sscce. org" rel="nofollow">SSCE , 并张贴您自己可以修改和校正的内容 。

Edit 3
Per our discussions in chat,
Your problem is when you call the To Top JButton, you are deleting the selected item from the list, while the ListSelectionListener is still listening, and this will cause a NPE to be thrown. A possible solution is to remove the ListSelectionListener before removing or adding any items, and then re-adding the listener after performing these actions. This will probably be necessary when you update your list model as well. Please see my SSCCE below. Also see how it is much easier to read and understand SSCCE code than your big code.

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
      }
   }
}
问题回答

暂无回答




相关问题
Spring Properties File

Hi have this j2ee web application developed using spring framework. I have a problem with rendering mnessages in nihongo characters from the properties file. I tried converting the file to ascii using ...

Logging a global ID in multiple components

I have a system which contains multiple applications connected together using JMS and Spring Integration. Messages get sent along a chain of applications. [App A] -> [App B] -> [App C] We set a ...

Java Library Size

If I m given two Java Libraries in Jar format, 1 having no bells and whistles, and the other having lots of them that will mostly go unused.... my question is: How will the larger, mostly unused ...

How to get the Array Class for a given Class in Java?

I have a Class variable that holds a certain type and I need to get a variable that holds the corresponding array class. The best I could come up with is this: Class arrayOfFooClass = java.lang....

SQLite , Derby vs file system

I m working on a Java desktop application that reads and writes from/to different files. I think a better solution would be to replace the file system by a SQLite database. How hard is it to migrate ...

热门标签