Java JList停止选择最后一项
我在选择列表时遇到问题。当我单击JList中的任何对象时,都会选择该对象 但当我在空白处的所有对象下方单击时,将选择JList中的最后一项。 我怎样才能关掉它?我不想在单击空白区域中所有对象的下方后选择JList中的最后一个对象 在几句评论之后,我在这里添加了代码示例Java JList停止选择最后一项,java,swing,select,jlist,Java,Swing,Select,Jlist,我在选择列表时遇到问题。当我单击JList中的任何对象时,都会选择该对象 但当我在空白处的所有对象下方单击时,将选择JList中的最后一项。 我怎样才能关掉它?我不想在单击空白区域中所有对象的下方后选择JList中的最后一个对象 在几句评论之后,我在这里添加了代码示例 import java.awt.Color; import java.awt.Dimension; import javax.swing.DefaultListModel; import javax.swing.JFrame;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
public class TestOfJList extends JFrame{
private static JList playList;
private static DefaultListModel<String> modelPlayList;
private static JPanel mainPanel;
private static MyCellRenderer myRendererForJlist;
private static void createAndShowGUI() {
JFrame.setDefaultLookAndFeelDecorated(true);
try {
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
}catch (Exception e){
e.printStackTrace();
}
JFrame frame = new JFrame("JListTest!");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(700, 250, 300, 400);
frame.setResizable(false);
mainPanel = new JPanel();
modelPlayList = new DefaultListModel<String>();
modelPlayList.addElement("Hello world!");
modelPlayList.addElement("Hello heaven!");
modelPlayList.addElement("Hello hell!");
playList = new JList(modelPlayList);
playList.setPreferredSize(new Dimension(270,500));
playList.setVisible(true);
playList.setBackground(Color.LIGHT_GRAY);
playList.setSelectionBackground(Color.YELLOW);
playList.setSelectedIndex(0);
playList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
playList.setDragEnabled(true);
playList.setDropMode(javax.swing.DropMode.ON_OR_INSERT);
playList.setFixedCellHeight(20);
JScrollPane scrollPane = new JScrollPane(playList);
scrollPane.setPreferredSize(new Dimension(300,400));
mainPanel.add(scrollPane);
myRendererForJlist = new MyCellRenderer();
playList.setCellRenderer(myRendererForJlist);
frame.add(mainPanel);
frame.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
MCVE 2:
import java.awt.event.MouseListener;
import javax.swing.*;
public class TestList {
public static final String[] ITEMS = { "One", "Two", "Three", "Four", "Five" };
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JList<String> myList = new JList<>(ITEMS);
myList.setVisibleRowCount(10);
JScrollPane sPane = new JScrollPane(myList);
// just to see what listeners are involved
MouseListener[] mouseListeners = myList.getListeners(MouseListener.class);
System.out.println(mouseListeners.length);
MouseMotionListener[] mouseMotionListeners = myList.getListeners(MouseMotionListener.class);
System.out.println(mouseMotionListeners.length);
JOptionPane.showMessageDialog(null, sPane);
}
});
}
}
您需要更改scrollpane的首选大小,因为它会在整个主面板上展开,当您在空白处单击最后一个元素时,它会被选中 更改:-
scrollPane.setPreferredSize(new Dimension(300,400));
到
现在单击下面的列表将不会更改选择
它将如下所示
请分享一些代码,说明如何构造这个列表以获得更好的帮助,考虑创建和发布一个。我们不希望看到您的整个程序,但您应该将代码压缩到最小的位,该位仍然可以编译,没有与您的问题无关的额外代码,但仍然可以演示您的问题。已添加代码。我认为它现在可以打开了。我看到的一个问题是您设置的尺寸和/或首选的尺寸使您的JList比它应该的大。您不应该在JList上设置大小或首选大小。这仍然不能解决我的问题。当我注释这些行时,它仍然会在单击所有对象下方后选择最后一个对象。尺码/首选尺码与此无关。我照你说的做了,但仍然不起作用。单击JList中所有对象下方后,将选择最后一个元素。您需要设置首选大小,以便用户无法在scrollpane的emtpy区域中单击。查看ScrollPane标记灰色和panellightscrollPane的颜色差异。设置PreferredSizeNew Dimension300,70;这不是正确的解决方案,因为我不知道JList中有多少对象。如果我使用您的解决方案,我仍然必须检查JList中有多少对象,并且牢记这一点,我必须更改JList的大小。那有很多工作要做。必须有另一个更好的解决方案,像这样。这就是jscrollpane将要出现的地方。添加10-11个元素并检查
scrollPane.setPreferredSize(new Dimension(300,100));