Hallo!
In meinem Dialog gibt es im Prinzip ein JList und ein ListModel. Das ListModel fügt neue Zeilen ein. Das JList wird korrekt aktualisiert. Das Problem: wenn die Zeile nach den neu eingefügten Zeilen selektiert war, sind die neuen Zeilen auch selektiert.
Erstens erscheint mir das unlogisch. Eine Selektion sollte durch den Benutzer vorgenommen werden. Da wurde für meine Begriffe zuviel Intelligenz in den Einfügeprozess integriert.
Zweitens wird bei meinem JList jede vorgenomme Selektion ausgewertet. In diesem Fall ist die "Zwangsselektion" auch fachlich falsch.
Wie kann ich verhindern, dass neue Zeilen immer selektiert sind, wenn die folgende Zeile vor dem Einfügen selektiert war?
Ich habe einen Beispielcode erstellt, der das Problem auf das Wesentliche reduziert:
Für meine konkrete Aufgabe habe ich das Problem erstmal gelöst. Aber höchst unsauber. Das funktioniert nur, wenn dem ListModel sein (praktischerweise) einziges JList und sein (praktischerweise) einziger JDialog schon mitteilt wird.
Diese "Lösung" stellt mich nicht zufrieden. Wie kann ich sauber verhindern, dass neue Einträge gleich selektiert werden?
Gibt es irgendwo ein Attribut für dafür? Müsste ich den ListDataListener anpassen? Oder das ListSelectionModel?
In meinem Dialog gibt es im Prinzip ein JList und ein ListModel. Das ListModel fügt neue Zeilen ein. Das JList wird korrekt aktualisiert. Das Problem: wenn die Zeile nach den neu eingefügten Zeilen selektiert war, sind die neuen Zeilen auch selektiert.
Erstens erscheint mir das unlogisch. Eine Selektion sollte durch den Benutzer vorgenommen werden. Da wurde für meine Begriffe zuviel Intelligenz in den Einfügeprozess integriert.
Zweitens wird bei meinem JList jede vorgenomme Selektion ausgewertet. In diesem Fall ist die "Zwangsselektion" auch fachlich falsch.
Wie kann ich verhindern, dass neue Zeilen immer selektiert sind, wenn die folgende Zeile vor dem Einfügen selektiert war?
Ich habe einen Beispielcode erstellt, der das Problem auf das Wesentliche reduziert:
Java:
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import java.util.Vector;
import javax.swing.AbstractListModel;
import javax.swing.JButton;
import javax.swing.JList;
import javax.swing.WindowConstants;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.SwingUtilities;
class TestListModel extends AbstractListModel {
private List<String> m_vList;
public TestListModel() {
m_vList = new Vector<String>();
m_vList.add("One");
m_vList.add("Two");
m_vList.add("Three");
m_vList.add("Four");
}
public Object getElementAt(int index) { return m_vList.get(index); }
public int getSize() { return m_vList.size(); }
public void doRemove() {
m_vList.remove(0);
m_vList.remove(0);
fireIntervalRemoved(this, 0, 1);
}
public void doAdd() {
m_vList.add(0, "One");
m_vList.add(1, "Two");
fireIntervalAdded(this, 0, 1);
}
}
public class DemoJListSelection extends javax.swing.JFrame {
private JList jListTest;
private JButton jButtonSelect;
private JButton jButtonRemove;
private JButton jButtonAdd;
private TestListModel jListTestModel;
/**
* Auto-generated main method to display this JFrame
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
DemoJListSelection inst = new DemoJListSelection();
inst.setLocationRelativeTo(null);
inst.setVisible(true);
}
});
}
public DemoJListSelection() {
super();
initGUI();
}
private void initGUI() {
try {
GridLayout thisLayout = new GridLayout(4, 1);
thisLayout.setColumns(1);
thisLayout.setHgap(5);
thisLayout.setVgap(5);
thisLayout.setRows(4);
getContentPane().setLayout(thisLayout);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
{
jListTestModel = new TestListModel();
jListTest = new JList();
getContentPane().add(jListTest);
jListTest.setModel(jListTestModel);
jListTest.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent evt) {
System.out.println(
"ListSelectionEvent: ValueIsAdjusting="+evt.getValueIsAdjusting()+
", FirstIndex="+evt.getFirstIndex()+", LastIndex="+evt.getLastIndex());
}
});
}
{
jButtonSelect = new JButton();
getContentPane().add(jButtonSelect);
jButtonSelect.setText("Selektieren");
jButtonSelect.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
jListTest.setSelectedIndex(2);
}
});
}
{
jButtonRemove = new JButton();
getContentPane().add(jButtonRemove);
jButtonRemove.setText("Entfernen");
jButtonRemove.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
jListTestModel.doRemove();
}
});
}
{
jButtonAdd = new JButton();
getContentPane().add(jButtonAdd);
jButtonAdd.setText("Hinzufügen");
jButtonAdd.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
jListTestModel.doAdd();
}
});
}
pack();
this.setSize(400, 361);
} catch (Exception e) {
//add your error handling code here
e.printStackTrace();
}
}
}
Für meine konkrete Aufgabe habe ich das Problem erstmal gelöst. Aber höchst unsauber. Das funktioniert nur, wenn dem ListModel sein (praktischerweise) einziges JList und sein (praktischerweise) einziger JDialog schon mitteilt wird.
Diese "Lösung" stellt mich nicht zufrieden. Wie kann ich sauber verhindern, dass neue Einträge gleich selektiert werden?
Gibt es irgendwo ein Attribut für dafür? Müsste ich den ListDataListener anpassen? Oder das ListSelectionModel?