0

我想制作自己的方法来控制组件何时为“isSelected”。

我有一个JList包含多个JPanel. 的构造类JPanel extends ListCellRenderer<>

为了显示选择了一个 JList 组件(JPanels),我使用;

@Override
public Component getListCellRendererComponent(..., boolean isSelected, ...) {
    if(isSelected){
        setBackground(list.getSelectionBackground());
        setForeground(list.getSelectionForeground());
    } else {
        setBackground(list.getBackground());
        setForeground(list.getForeground());
    }
    return this;
}

我想要一种方法,即使我选择选择另一个,也可以保持选定的项目“选中”。我知道这可以通过按住 CTRL 来完成,但.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);并不完全奏效。我宁愿通过单击它们来选择多个,并通过单击它们来取消选择。

为此,我使用了 ListSelectionMode,但我找不到方法。

完成上述操作后,我想实现一种方法,该方法仅在单击某个区域时选择列表中的一个组件(而不是预设的整个组件)。我已经制作了这个方法,如果单击正确的区域,则返回 true,否则返回 false。但是由于我不知道如何覆盖使组件“isSelected”的mouseevent,所以这很棘手。

这是我想覆盖“isSelected”方法的方法的代码;

this.addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent evt) {
            if(ActionHandler.mouseClickedPrebuild(evt.getPoint())){
                //This code runs if that special place is clicked!
                //So now the component should be 'isSelected' or
                //deselected if it already was 'isSelected'.
            }
        }
    });

这段代码在我的构造函数中JList

以及mouseClickedPrebuild方法;

public static boolean mouseClickedPrebuild(Point point) {
        int index = theJList.locationToIndex(point);
        Rectangle bounds = theJList.getCellBounds(index,index);
        Point p = bounds.getLocation();
        return ( ... long list of greater than & less than ...);
        //This gives the certain area which is accepted to return true
4

1 回答 1

0

我解决了这个问题!

所以我通过运行这条线来展示我的观点;

// UI Class   JScrollPane               Custom JList
UIConstructor.listview.setViewportView(new ListView( -insert ArrayList here- ));

这是我的列表视图。我用来解决问题的自定义 DefaultListSelectionModel 由 @FuryComptuers 在这里发布;

JList - 单击已选择的项目时取消选择

我不得不对代码进行一些更改,因为其中的两个方法selectionModel将在我的 mouseevent 之前运行。我静态保存了变量,所以setSelectionInterval我没有在其中运行代码,而是在我的mousePressed.

isSelected然后,如果单击特定列表元素中的窗帘区域,我可以添加返回 true 的布尔值。

public class ListViewd extends JList {

static boolean isSelected;
static Point point;

static boolean gS = false;
static int in0;
static int in1;

@Override
public Dimension getPreferredScrollableViewportSize() {
    Dimension size = super.getPreferredScrollableViewportSize();
    size.setSize(new Dimension(0,0));
    return size;
}

public ListView(ArrayList<System> items) {

    DefaultListModel<System> list = new DefaultListModel<System>();

    for (System item : items) {
        list.addElement(item);
    }

    this.setSelectionModel(new DefaultListSelectionModel() {

        boolean gestureStarted = false;

        @Override
        public void setSelectionInterval(int index0, int index1) {
            gS = gestureStarted;
            in0 = index0;
            in1 = index1;

            gestureStarted = true;
        }

        @Override
        public void setValueIsAdjusting(boolean isAdjusting) {
            if (!isAdjusting) {
                gestureStarted = false;
            }
        }

    });

    ListSelectionModel selectionModel = this.getSelectionModel();

    addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent e) {
            point = e.getPoint();
            isSelected = ActionHandler.mouseClickedPrebuild(point);

            if(!gS && isSelected){
                if (isSelectedIndex(in0)) {
                    selectionModel.removeSelectionInterval(in0, in1);
                } else {
                    selectionModel.addSelectionInterval(in0, in1);
                }
            }
        }
    });

    setModel(list);
    setCellRenderer(new ListModelPrebuild());
}
于 2016-03-17T02:57:39.460 回答