[英]What exactly is ListSelectionModel.insertIndexInterval() doing?
我正在嘗試編寫自己的ListSelectionModel實現 ,目前我在嘗試實現insertIndexInterval
。 我不理解Sun的/ Oracle的DefautListSelectionModel
實現中此方法的結果。 這是一個例子:
ListSelectionModel model = new DefaultListSelectionModel();
model.setSelectionInterval(3, 5);
model.addListSelectionListener(new ListSelectionListener()
{
public void valueChanged(ListSelectionEvent e)
{
System.out.println("Changed range reported by event: " +
e.getFirstIndex() + "-" + e.getLastIndex());
}
});
System.out.print("Selected indices before insert: ");
for (int i = model.getMinSelectionIndex(); i <= model.getMaxSelectionIndex(); i++)
if (model.isSelectedIndex(i)) System.out.print(i + " ");
System.out.println();
model.insertIndexInterval(3, 3, true);
System.out.print("Selected indices after insert: ");
for (int i = model.getMinSelectionIndex(); i <= model.getMaxSelectionIndex(); i++)
if (model.isSelectedIndex(i)) System.out.print(i + " ");
System.out.println();
當您運行此代碼時,您將獲得此輸出:
Selected indices before insert: 3 4 5
Changed range reported by event: 3-8
Selected indices after insert: 3 4 5 6 7 8
因此,初始選擇是3-5,並在插入新索引時擴展到3-8。 但是已經選擇了3-5個,所以真正的變化只有6-8,為什么事件告訴我3-8的范圍已經改變了? 將insertIndexInterval
調用更改為insertIndexInterval
更令人困惑:
model.insertIndexInterval(3, 3, false);
現在輸出是這樣的:
Selected indices before insert: 3 4 5
Changed range reported by event: 5-8
Selected indices after insert: 3 4 5 6 7 8
我不知道為什么報道的變化是5-8。
此方法的API文檔太短,無法理解其中發生的情況。 特別是這個參數before
對我來說是一個謎,因為它對選擇沒有任何影響,但它似乎對事件以及鉛和錨索引有一些影響。
我甚至無法為我的實現編寫單元測試,因為我根本不知道預期的結果。
那么有人可以詳細解釋這個方法(特別是before
flag)正在做什么以及它對選擇模型和ListSelectionEvent
有什么副作用?
將新數據添加到數據模型時使用它(因此應移動當前選擇索引)。 如果2表示“新添加和選擇”,則表示輸出為:
[0,0,0,1,1,1,0,0,0,0] == [3A,4,5L]
-> add after [0,0,0,1,2,2,2,1,1,0] == [3A,4,5,6,7,8L]
-> add before [0,0,0,2,2,2,1,1,1,0] == [3,4,5,6A,7,8L]
你在這里看到的是DefaultListSelectionModel的一個特征* - 在當前選擇中添加索引,自動擴展選擇。
例如,選擇索引1,然后在索引3處插入三行:
[1,0,0,0,0,0,0,0,0,0]
-> add after [1,0,0,0,0,0,0,0,0,0]
請注意,您的選擇表示具有誤導性,零不是真的存在。 打印選擇狀態的更好方法是:
private static void printSelection(ListSelectionModel model) {
System.out.print("[");
for (int i = model.getMinSelectionIndex(); i <= model.getMaxSelectionIndex(); i++) {
if(i > model.getMinSelectionIndex()) {
System.out.print(",");
}
if(model.isSelectedIndex(i)) {
System.out.print(i);
if(i == model.getAnchorSelectionIndex()) {
System.out.print("A");
}
if(i == model.getLeadSelectionIndex()) {
System.out.print("L");
}
}
}
System.out.println("]");
}
*)DefaultListSelectionModel#insertIndexInterval的文檔與界面不同,另請參閱http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4700643和http://java.net/jira/browse/SWINGX-272
編輯我希望我們談論JList,而不是關於JTable,然后休息是在通知中
你可以使用這個SSCCE並用代碼編輯你的問題,清楚地用ListSelectionModel
, ListeSelectionMode
和相關代碼的解決方法調整你的問題, notice
這個Listener
只有一個dimension
或directional
,
import java.awt.Component;
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import javax.swing.*;
public class Ctrl_Down_JList {
private static void createAndShowUI() {
String[] items = {"Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat"};
JList myJList = new JList(items) {
private static final long serialVersionUID = 1L;
@Override
protected void processMouseEvent(MouseEvent e) {
int modifiers = e.getModifiers() | InputEvent.CTRL_MASK;
// change the modifiers to believe that control key is down
int modifiersEx = e.getModifiersEx() | InputEvent.CTRL_MASK;
// can I use this anywhere? I don't see how to change the modifiersEx of the MouseEvent
MouseEvent myME = new MouseEvent((Component) e.getSource(), e.getID(), e.getWhen(), modifiers, e.getX(),
e.getY(), e.getXOnScreen(), e.getYOnScreen(), e.getClickCount(), e.isPopupTrigger(), e.getButton());
super.processMouseEvent(myME);
}
};
JFrame frame = new JFrame("Ctrl_Down_JList");
frame.getContentPane().add(new JScrollPane(myJList));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
createAndShowUI();
}
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.