java jlist checkbox_JCheckBox检查Java中的JList中的切换逻辑时遇到问题

如果我理解这个问题......

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class JListToggleLogicTest {

private final ClearSelectionListener listener = new ClearSelectionListener();

public JComponent makeUI() {

JList list = new JList(makeModel()) {

@Override public void setSelectionInterval(int anchor, int lead) {

if(anchor==lead && lead>=0 && anchor>=0) {

if(listener.isDragging) {

addSelectionInterval(anchor, anchor);

} else if(!listener.isCellInsideDragging) {

if(isSelectedIndex(anchor)) {

removeSelectionInterval(anchor, anchor);

} else {

addSelectionInterval(anchor, anchor);

}

listener.isCellInsideDragging = true;

}

} else {

super.setSelectionInterval(anchor, lead);

}

}

};

list.setCellRenderer(new CheckBoxCellRenderer());

list.addMouseListener(listener);

list.addMouseMotionListener(listener);

JPanel p = new JPanel(new GridLayout(1,2));

p.add(makeTitledPanel("Default", new JList(makeModel())));

p.add(makeTitledPanel("SelectionInterval", list));

return p;

}

private static DefaultListModel makeModel() {

DefaultListModel model = new DefaultListModel<>();

model.addElement("aaaaaaa");

model.addElement("bbbbbbbbbbbbb");

model.addElement("cccccccccc");

model.addElement("ddddddddd");

model.addElement("eeeeeeeeee");

return model;

}

private static JComponent makeTitledPanel(String title, JComponent c) {

JPanel p = new JPanel(new BorderLayout());

p.setBorder(BorderFactory.createTitledBorder(title));

p.add(new JScrollPane(c));

return p;

}

public static void main(String[] args) {

EventQueue.invokeLater(new Runnable() {

@Override public void run() {

createAndShowGUI();

}

});

}

public static void createAndShowGUI() {

JFrame f = new JFrame();

f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

f.getContentPane().add(new JListToggleLogicTest().makeUI());

f.setSize(320, 240);

f.setLocationRelativeTo(null);

f.setVisible(true);

}

}

class ClearSelectionListener extends MouseAdapter {

private static void clearSelectionAndFocus(JList list) {

list.getSelectionModel().clearSelection();

list.getSelectionModel().setAnchorSelectionIndex(-1);

list.getSelectionModel().setLeadSelectionIndex(-1);

}

private static boolean contains(JList list, Point pt) {

for(int i=0; i

Rectangle r = list.getCellBounds(i, i);

if(r.contains(pt)) return true;

}

return false;

}

private boolean startOutside = false;

private int startIndex = -1;

public boolean isDragging = false;

public boolean isCellInsideDragging = false;

@Override public void mousePressed(MouseEvent e) {

JList list = (JList)e.getSource();

startOutside = !contains(list, e.getPoint());

startIndex = list.locationToIndex(e.getPoint());

if(startOutside) {

clearSelectionAndFocus(list);

}

}

@Override public void mouseReleased(MouseEvent e) {

startOutside = false;

isDragging = false;

isCellInsideDragging = false;

startIndex = -1;

}

@Override public void mouseDragged(MouseEvent e) {

JList list = (JList)e.getSource();

if(!isDragging && startIndex == list.locationToIndex(e.getPoint())) {

isCellInsideDragging = true;

} else {

isDragging = true;

isCellInsideDragging = false;

}

if(contains(list, e.getPoint())) {

startOutside = false;

isDragging = true; //add:2012-06-01

} else if(startOutside) {

clearSelectionAndFocus(list);

}

}

}

class CheckBoxCellRenderer extends JCheckBox implements ListCellRenderer {

@Override public Component getListCellRendererComponent(

JList extends String> list, String value, int index,

boolean isSelected, boolean cellHasFocus) {

setOpaque(true);

if(isSelected) {

setBackground(list.getSelectionBackground());

setForeground(list.getSelectionForeground());

setSelected(true);

}else{

setBackground(list.getBackground());

setForeground(list.getForeground());

setSelected(false);

}

setText(value);

return this;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值