Hallo,
nachdem ich zum allerersten Mal mit reinem Suchen nicht weiterkomme, habe ich mich hier angemeldet, in der Hoffnung, dass ich als aktiver Fragesteller eine Antwort auf mein Problem bekomme.
Ich will vorausschicken, dass ich, obwohl ich mit dem Swing-Framework jetzt schon mehrere Projekte umgesetzt habe, noch immer nicht so ganz verstehe, wie die vielen Komponenten aus dem Umfeld von JTable zusammenarbeiten.
Mein Problem stellt sich wie folgt dar: Ich brauche eine Tabelle, in der sich die Spalten per Drag and Drop vertauschen lassen, allerdings will ich einzelne Spalten davon ausnehmen. Mein bisheriger Ansatz ist, dass ich die moveColum()-Methode des TableColumnModels für meine Zwecke überschreibe, etwa so:
Diese Lösung verhindert zwar, dass die (in diesem Fall) erste Spalte ihre Position verändert, aber dennoch ist es möglich, im GUI den Spaltenheader mit der Maus herumzuziehen. Wird die Kopfzelle über eine andere Spalte gezogen, bleibt sie anschließend an einer falschen Position stehen. Das soll der Endbenutzer so natürlich nicht zu sehen bekommen.
Daher hoffe ich, dass mir jemand erklären kann, wo in dem ganzen JTable-Paket das Drag and Drop-Verhalten der Head bestimmt wird. Vielleicht befinde ich mich mit meiner Herangehensweise aber auch völlig auf dem Holzweg und jemand kann mir mit einem besseren Vorschlag weiterhelfen. Ich bin gerade mit meinem Latein am Ende und dankbar für jede Unterstützung. :rtfm:
Hier der Code, den ich gerade zum Testen verwende:
nachdem ich zum allerersten Mal mit reinem Suchen nicht weiterkomme, habe ich mich hier angemeldet, in der Hoffnung, dass ich als aktiver Fragesteller eine Antwort auf mein Problem bekomme.
Ich will vorausschicken, dass ich, obwohl ich mit dem Swing-Framework jetzt schon mehrere Projekte umgesetzt habe, noch immer nicht so ganz verstehe, wie die vielen Komponenten aus dem Umfeld von JTable zusammenarbeiten.
Mein Problem stellt sich wie folgt dar: Ich brauche eine Tabelle, in der sich die Spalten per Drag and Drop vertauschen lassen, allerdings will ich einzelne Spalten davon ausnehmen. Mein bisheriger Ansatz ist, dass ich die moveColum()-Methode des TableColumnModels für meine Zwecke überschreibe, etwa so:
Java:
class NewTableColumnModel extends DefaultTableColumnModel{
public NewTableColumnModel(){
}
public void moveColumn(int oldIndex, int newIndex){
if(oldIndex < 0 || oldIndex >= getColumnCount() || newIndex < 0 || newIndex >= getColumnCount())
throw new IllegalArgumentException();
if(oldIndex != 0 && newIndex != 0)
super.moveColumn(oldIndex, newIndex);
}
}
Daher hoffe ich, dass mir jemand erklären kann, wo in dem ganzen JTable-Paket das Drag and Drop-Verhalten der Head bestimmt wird. Vielleicht befinde ich mich mit meiner Herangehensweise aber auch völlig auf dem Holzweg und jemand kann mir mit einem besseren Vorschlag weiterhelfen. Ich bin gerade mit meinem Latein am Ende und dankbar für jede Unterstützung. :rtfm:
Hier der Code, den ich gerade zum Testen verwende:
Java:
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.DefaultTableModel;
class NewTableColumnModel extends DefaultTableColumnModel{
public NewTableColumnModel(){
}
public void moveColumn(int oldIndex, int newIndex){
if(oldIndex < 0 || oldIndex >= getColumnCount() || newIndex < 0 || newIndex >= getColumnCount())
throw new IllegalArgumentException();
if(oldIndex != 0 && newIndex != 0)
super.moveColumn(oldIndex, newIndex);
}
}
public class DnDTest extends JFrame{
private JPanel contentPane;
private JTable table;
private JScrollPane scrollPane;
public DnDTest() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 500, 250);
this.contentPane = new JPanel();
this.contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(this.contentPane);
GridBagLayout gbl_contentPane = new GridBagLayout();
gbl_contentPane.columnWidths = new int[]{375, 0};
gbl_contentPane.rowHeights = new int[]{160, 0};
gbl_contentPane.columnWeights = new double[]{0.0, Double.MIN_VALUE};
gbl_contentPane.rowWeights = new double[]{0.0, Double.MIN_VALUE};
this.contentPane.setLayout(gbl_contentPane);
this.scrollPane = new JScrollPane();
GridBagConstraints gbc_scrollPane = new GridBagConstraints();
gbc_scrollPane.fill = GridBagConstraints.BOTH;
gbc_scrollPane.gridx = 0;
gbc_scrollPane.gridy = 0;
this.contentPane.add(this.scrollPane, gbc_scrollPane);
String data[][] = {
{"1", "Bla", "Hoppeldoppel"},
{"2", "Blubb", "Hösndösn"},
{"3", "Blubber", "Wackeldackel"}
};
String[] colNames = {"A", "B", "C"};
this.table = new JTable();
this.table.setColumnModel(new NewTableColumnModel());
this.table.setModel(new DefaultTableModel(data, colNames));
this.scrollPane.setViewportView(this.table);
}
public static void main(String[] args){
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
DnDTest frame = new DnDTest();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}