Sortierung und Vertauschen von Spalten in JTable

mrsmola

Mitglied
Hallo zusammen,

ich stehe zur Zeit vor einem Problem mit der Sortierung in JTables.

Mein Ziel war es eine Tabelle zu gestalten, bei der alle Spalten (in Abhängigkeit von den maximalen SortKeys) sortierbar sind. Das hat auch soweit funktioniert. Zusätzlich möchte ich auch die Spalten verschieben können. Grundsätzlich funktioniert das auch. Das Problem ergibt sich bei mir aus der Kombination. Hier erstmal der BeispielCode:

Java:
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.List;

import javax.swing.BoxLayout;
import javax.swing.Icon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowSorter;
import javax.swing.SortOrder;
import javax.swing.RowSorter.SortKey;
import javax.swing.border.BevelBorder;
import javax.swing.border.LineBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.TableColumnModelEvent;
import javax.swing.event.TableColumnModelListener;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

public class TestTableDemo extends JFrame
{
	
	private TableRowSorter<TableModel> rowSorter = null;
	private JScrollPane scrollPane = null;
	
	public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TestTableDemo().setVisible(true);
            }
        });
    }
	
    public TestTableDemo()
    {
    	super("TableDemo");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        
        getContentPane().add( getScrollPaneSpieler() );
        pack();
    }
    
    private JScrollPane getScrollPaneSpieler()
	{
		if (scrollPane == null)
		{
			scrollPane = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_NEVER,
													  JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
			scrollPane.setOpaque(false);
			scrollPane.setBounds(new Rectangle(10, 130, 500, 300));
			scrollPane.setViewportView(getTable());
			scrollPane.getViewport().setOpaque(false); 
			scrollPane.getVerticalScrollBar().setOpaque(false);
			scrollPane.setBorder(new BevelBorder(BevelBorder.RAISED));
			scrollPane.setVisible(true);
		}	
		return scrollPane;
	}
    
    public JTable getTable()
    {
    	JTable table = null;
    	
    	Object[][] data = new Object[][]{
                {1, 5, 8, 9, 0},
                {2, 4, 7, 7, 5},
                {3, 3, 6, 8, 6},
                {7, 5, 8, 7, 7},
                {8, 1, 1, 1, 8},
                {8, 1, 9, 3, 1},
                {8, 2, 9, 3, 4},
                {8, 8, 2, 1, 8},
                {7, 5, 8, 9, 5}
        };
        
        String[] columnNames = new String[]{
                "Spalte A", "Spalte B", "Spalte C", "Spalte D", "Spalte E"
        };
        
        table = new JTable( data, columnNames );
        table.setLayout(new BoxLayout(table, BoxLayout.Y_AXIS));
		table.setOpaque(false);
		table.setPreferredSize(new Dimension(400,250));
		table.getTableHeader().setOpaque(false);
		table.setBorder(new LineBorder(Color.gray));
		
		table.setAutoCreateRowSorter(true);
		rowSorter = new TableRowSorter<TableModel>(table.getModel());
		rowSorter.setMaxSortKeys(2);
		table.setRowSorter(rowSorter);
		table.getColumnModel().addColumnModelListener(new ResortingColumnModelListener(table));
		
		TableColumn tableColumnA = table.getColumn("Spalte A");
    	tableColumnA.setResizable(false);
    	tableColumnA.setCellRenderer(new CellRenderer());
    	tableColumnA.setHeaderRenderer(new HeaderRenderer(table));
    	
    	TableColumn tableColumnB = table.getColumn("Spalte B");
    	tableColumnB.setResizable(false);
    	tableColumnB.setCellRenderer(new CellRenderer());
    	tableColumnB.setHeaderRenderer(new HeaderRenderer(table));
    	
    	TableColumn tableColumnC = table.getColumn("Spalte C");
    	tableColumnC.setResizable(false);
    	tableColumnC.setCellRenderer(new CellRenderer());
    	tableColumnC.setHeaderRenderer(new HeaderRenderer(table));
    	
    	TableColumn tableColumnD = table.getColumn("Spalte D");
    	tableColumnD.setResizable(false);
    	tableColumnD.setCellRenderer(new CellRenderer());
    	tableColumnD.setHeaderRenderer(new HeaderRenderer(table));
    	
    	TableColumn tableColumnE = table.getColumn("Spalte E");
    	tableColumnE.setResizable(false);
    	tableColumnE.setCellRenderer(new CellRenderer());
    	tableColumnE.setHeaderRenderer(new HeaderRenderer(table));
    	
    	return table;
    }
    
    public class ResortingColumnModelListener implements TableColumnModelListener
    {
    	private JTable table = null;
    	
    	public ResortingColumnModelListener(JTable _table)
    	{
    		table = _table;
    	}
    	
        public void columnMoved(TableColumnModelEvent e)
        {
        	RowSorter<?> sorter = null;
        	List<? extends SortKey> oldKeys = null;
        	List<SortKey> newKeys = null;
        	
            int fromView = e.getFromIndex(); //Index im View Herkunft
            int toView = e.getToIndex();     //Index im View neue Stelle
            
            if (fromView != toView)
            {
            	// Vertauschen der SortKeys der Spalten from und to, und
                // Übernahme aller anderen aus der alten Sortierung
                sorter = table.getRowSorter();
                oldKeys = sorter.getSortKeys();
                newKeys = new ArrayList<SortKey>();
                 
                for (SortKey key : oldKeys)
                {
                	if (fromView == key.getColumn())
                    {
                        newKeys.add(new RowSorter.SortKey(toView, key.getSortOrder()));
                    }
                    else if (toView == key.getColumn())
                    {
                    	newKeys.add(new RowSorter.SortKey(fromView, key.getSortOrder()));
                    }
                	else
                    {
                    	newKeys.add(new RowSorter.SortKey(key.getColumn(), key.getSortOrder()));
                    }
                }
                sorter.setSortKeys(newKeys);
            }
        }
        
        @Override
        public void columnAdded(TableColumnModelEvent e)
        {
        }

        @Override
        public void columnMarginChanged(ChangeEvent e)
        {
        }

        @Override
        public void columnRemoved(TableColumnModelEvent e)
        {
        }

        @Override
        public void columnSelectionChanged(ListSelectionEvent e)
        {
        }
    }
    
    public class CellRenderer extends DefaultTableCellRenderer implements TableCellRenderer {
        
    	public CellRenderer()
    	{
        	this.setHorizontalAlignment(JLabel.LEFT);
        	this.setForeground(Color.black);
        	this.setFont(new Font("Helvetica", Font.PLAIN,12));
            this.setOpaque(false);
        }
        
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col)
        {
        	this.setText(value.toString());
        	this.setSize(table.getCellRect(row, col, true).width, 16);
        	
            return this;
        }
    }
    
    public class HeaderRenderer extends DefaultTableCellRenderer implements TableCellRenderer {

    	private Icon mAscending = new AscendingIcon();
        private Icon mDescending = new DescendingIcon();
        private Icon mNull = new NullIcon();
       
        List<? extends SortKey> skeys = null;
        
    	public HeaderRenderer(JTable table)
    	{
        	this.setHorizontalAlignment(JLabel.LEFT);
            this.setForeground(Color.blue);
            this.setFont(new Font("Helvetica", Font.BOLD,12));
            this.setOpaque(false);
            this.setHorizontalAlignment(JLabel.CENTER);
        }
        
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col)
        {
        	this.setText(value.toString());
        	
        	skeys = table.getRowSorter().getSortKeys();
        	if (skeys != null)
        	{
       			for (SortKey sortKey : skeys)
       			{
       				if (col == sortKey.getColumn())
       				{
       					if(sortKey.getSortOrder() == SortOrder.ASCENDING)
       					{
       						setIcon(mAscending);
       						return this;
       					}
       					else if (sortKey.getSortOrder() == SortOrder.DESCENDING)
       					{
       						setIcon(mDescending);
       						return this;
       					}
       				}
       			}
       		}
        	setIcon(mNull);
        	return this;
        }
    }
    
    public class NullIcon implements Icon
    {
        public int getIconHeight()
        {
            return 6;
        }

        public int getIconWidth()
        {
            return 6;
        }

        public void paintIcon(Component pComponent, Graphics pGraphics, int pX, int pY)
        {
        }
    }
    
    public class AscendingIcon extends NullIcon
    {
        public void paintIcon(Component pComponent, Graphics pGraphics, int pX, int pY)
        {
            int[] xx = {pX, pX + 3, pX + 6};
            int[] yy = {pY + 6, pY, pY + 6};

            Color initialColor = pGraphics.getColor();
            float[] initial = Color.RGBtoHSB(initialColor.getRed(), initialColor.getGreen(), initialColor.getBlue(), null);
            boolean need = initial[2] < .5f;
            initial[2] = invertAsNeed(initial[2], need);

            Color line = Color.getHSBColor(initial[0], initial[1], invertAsNeed(initial[2] * .7f, need));
            Color fill = Color.getHSBColor(initial[0], initial[1], invertAsNeed(initial[2] * .35f, need));
            pGraphics.setColor(fill);
            pGraphics.fillPolygon(xx, yy, 3);
            pGraphics.setColor(line);
            pGraphics.drawPolygon(xx, yy, 3);
        }
        
        private float invertAsNeed(float pBright, boolean pNeed)
        {
            return pNeed ? 1 - pBright : pBright;
        }
    }
    
    public class DescendingIcon extends NullIcon {
       public void paintIcon(Component pComponent, Graphics pGraphics, int pX,
                int pY) {
            int[] xx = {pX, pX + 3, pX + 6};
            int[] yy = {pY, pY + 6, pY + 0};

            Color initialColor = pGraphics.getColor();
            float[] initial = Color.RGBtoHSB(initialColor.getRed(),
                    initialColor.getGreen(), initialColor.getBlue(), null);

            boolean need = initial[2] < .5f;
            initial[2] = invertAsNeed(initial[2], need);

            Color line = Color.getHSBColor(initial[0], initial[1],
                    invertAsNeed(initial[2] * .7f, need));
            Color fill = Color.getHSBColor(initial[0], initial[1],
                    invertAsNeed(initial[2] * .35f, need));
            pGraphics.setColor(fill);
            pGraphics.fillPolygon(xx, yy, 3);
            pGraphics.setColor(line);
            pGraphics.drawPolygon(xx, yy, 3);
        }
        
        private float invertAsNeed(float pBright, boolean pNeed)
        {
            return pNeed ? 1 - pBright : pBright;
        }
    }
}

Sind z.B. die Spalten A und B sortiert und ich verschiebe die Spalte C zwischen A und B, dann passieren meiner Meinung nach 2 Fehler:

Der Sortierungspfeil der Spalte B wandert nicht mit der Spalte (das Problem habe ich versucht durch den ResortingColumnModelListener zu beheben).

Viel schlimmer ist jedoch, dass etwas im Model nicht mehr stimmt. Ein weiterer Klick auf Spalte B (jetzt 3. Spalte) sortiert nun die Spalte C (jetzt 2. Spalte).

Was mache ich falsch?
 

Marco13

Top Contributor
Ggf. muss man da nochmal genauer nachsehen, aber wenn man diesen Listener rausnimmt und im HeaderRenderer
Code:
                for (SortKey sortKey : skeys)
                {
[b]                    int columnIndex = table.convertColumnIndexToModel(sortKey.getColumn());[/b]
                    if (col == columnIndex)
                    {
macht sieht es spontan gar nicht mal so falsch aus?!
 

mrsmola

Mitglied
Grundsätzlich ist mit der Änderung das Sortierverhalten der Tabelle richtig. Es werden nach dem Tauschen von Spalten nicht mehr andere Spalten sortiert als man anklickt.

Mit dem jetzigen Sortierverhalten stellt sich mir folgende Frage. Bei Tauschen von Spalten wandert die Sortierung nicht mit der Spalte mit. Ist das generell so oder hat der Code noch einen Fehler?

Beispiel: Spalte A und Spalte B werden sortiert. Spalte C ist nicht sortiert. Jetzt verschiebe ich Spalte C zwischen A und B. Die Reihenfolge ist dann ACB. Mein erwartetes Verhalten wäre, dass nach wie vor die Spalten A und B Sortierschlüssel sind. Das ist jedoch nicht der Fall. Nach dem Tausch der Spalten sind die Sortierschlüssel A und C. Die Tabelle wird auch mit dem Tausch der Spalten sofort nach den neuen Sortierschlüsseln sortiert.

Hier der aktuelle Code:
Java:
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.List;

import javax.swing.BoxLayout;
import javax.swing.Icon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowSorter;
import javax.swing.SortOrder;
import javax.swing.RowSorter.SortKey;
import javax.swing.border.BevelBorder;
import javax.swing.border.LineBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.TableColumnModelEvent;
import javax.swing.event.TableColumnModelListener;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

public class TestTableDemo extends JFrame
{
	
	private TableRowSorter<TableModel> rowSorter = null;
	private JScrollPane scrollPane = null;
	
	public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TestTableDemo().setVisible(true);
            }
        });
    }
	
    public TestTableDemo()
    {
    	super("TableDemo");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        
        getContentPane().add( getScrollPaneSpieler() );
        pack();
    }
    
    private JScrollPane getScrollPaneSpieler()
	{
		if (scrollPane == null)
		{
			scrollPane = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_NEVER,
													  JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
			scrollPane.setOpaque(false);
			scrollPane.setBounds(new Rectangle(10, 130, 500, 300));
			scrollPane.setViewportView(getTable());
			scrollPane.getViewport().setOpaque(false); 
			scrollPane.getVerticalScrollBar().setOpaque(false);
			scrollPane.setBorder(new BevelBorder(BevelBorder.RAISED));
			scrollPane.setVisible(true);
		}	
		return scrollPane;
	}
    
    public JTable getTable()
    {
    	JTable table = null;
    	
    	Object[][] data = new Object[][]{
                {1, 5, 8, 9, 0},
                {2, 4, 7, 7, 5},
                {3, 3, 6, 8, 6},
                {7, 5, 8, 7, 7},
                {8, 1, 1, 1, 8},
                {8, 1, 9, 3, 1},
                {8, 2, 9, 3, 4},
                {8, 8, 2, 1, 8},
                {7, 5, 8, 9, 5}
        };
        
        String[] columnNames = new String[]{
                "Spalte A", "Spalte B", "Spalte C", "Spalte D", "Spalte E"
        };
        
        table = new JTable( data, columnNames );
        table.setLayout(new BoxLayout(table, BoxLayout.Y_AXIS));
		table.setOpaque(false);
		table.setPreferredSize(new Dimension(400,250));
		table.getTableHeader().setOpaque(false);
		table.setBorder(new LineBorder(Color.gray));
		
		table.setAutoCreateRowSorter(true);
		rowSorter = new TableRowSorter<TableModel>(table.getModel());
		rowSorter.setMaxSortKeys(2);
		table.setRowSorter(rowSorter);
		table.getColumnModel().addColumnModelListener(new ResortingColumnModelListener(table));
		
		TableColumn tableColumnA = table.getColumn("Spalte A");
    	tableColumnA.setResizable(false);
    	tableColumnA.setCellRenderer(new CellRenderer());
    	tableColumnA.setHeaderRenderer(new HeaderRenderer(table));
    	
    	TableColumn tableColumnB = table.getColumn("Spalte B");
    	tableColumnB.setResizable(false);
    	tableColumnB.setCellRenderer(new CellRenderer());
    	tableColumnB.setHeaderRenderer(new HeaderRenderer(table));
    	
    	TableColumn tableColumnC = table.getColumn("Spalte C");
    	tableColumnC.setResizable(false);
    	tableColumnC.setCellRenderer(new CellRenderer());
    	tableColumnC.setHeaderRenderer(new HeaderRenderer(table));
    	
    	TableColumn tableColumnD = table.getColumn("Spalte D");
    	tableColumnD.setResizable(false);
    	tableColumnD.setCellRenderer(new CellRenderer());
    	tableColumnD.setHeaderRenderer(new HeaderRenderer(table));
    	
    	TableColumn tableColumnE = table.getColumn("Spalte E");
    	tableColumnE.setResizable(false);
    	tableColumnE.setCellRenderer(new CellRenderer());
    	tableColumnE.setHeaderRenderer(new HeaderRenderer(table));
    	
    	return table;
    }
    
    public class ResortingColumnModelListener implements TableColumnModelListener
    {
    	private JTable table = null;
    	
    	public ResortingColumnModelListener(JTable _table)
    	{
    		table = _table;
    	}
    	
        public void columnMoved(TableColumnModelEvent e)
        {
        	RowSorter<?> sorter = null;
        	List<? extends SortKey> oldKeys = null;
        	List<SortKey> newKeys = null;
        	
            int fromView = e.getFromIndex(); //Index im View Herkunft
            int toView = e.getToIndex();     //Index im View neue Stelle
            
            if (fromView != toView)
            {
            	// Vertauschen der SortKeys der Spalten from und to, und
                // Übernahme aller anderen aus der alten Sortierung
                sorter = table.getRowSorter();
                oldKeys = sorter.getSortKeys();
                newKeys = new ArrayList<SortKey>();
                 
                for (SortKey key : oldKeys)
                {
                	if (fromView == key.getColumn())
                    {
                        newKeys.add(new RowSorter.SortKey(toView, key.getSortOrder()));
                    }
                    else if (toView == key.getColumn())
                    {
                    	newKeys.add(new RowSorter.SortKey(fromView, key.getSortOrder()));
                    }
                	else
                    {
                    	newKeys.add(new RowSorter.SortKey(key.getColumn(), key.getSortOrder()));
                    }
                }
                sorter.setSortKeys(newKeys);
            }
        }
        
        @Override
        public void columnAdded(TableColumnModelEvent e)
        {
        }

        @Override
        public void columnMarginChanged(ChangeEvent e)
        {
        }

        @Override
        public void columnRemoved(TableColumnModelEvent e)
        {
        }

        @Override
        public void columnSelectionChanged(ListSelectionEvent e)
        {
        }
    }
    
    public class CellRenderer extends DefaultTableCellRenderer implements TableCellRenderer {
        
    	public CellRenderer()
    	{
        	this.setHorizontalAlignment(JLabel.LEFT);
        	this.setForeground(Color.black);
        	this.setFont(new Font("Helvetica", Font.PLAIN,12));
            this.setOpaque(false);
        }
        
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col)
        {
        	this.setText(value.toString());
        	this.setSize(table.getCellRect(row, col, true).width, 16);
        	
            return this;
        }
    }
    
    public class HeaderRenderer extends DefaultTableCellRenderer implements TableCellRenderer {

    	private Icon mAscending = new AscendingIcon();
        private Icon mDescending = new DescendingIcon();
        private Icon mNull = new NullIcon();
       
        List<? extends SortKey> skeys = null;
        
    	public HeaderRenderer(JTable table)
    	{
        	this.setHorizontalAlignment(JLabel.LEFT);
            this.setForeground(Color.blue);
            this.setFont(new Font("Helvetica", Font.BOLD,12));
            this.setOpaque(false);
            this.setHorizontalAlignment(JLabel.CENTER);
        }
        
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col)
        {
        	this.setText(value.toString());
        	
        	skeys = table.getRowSorter().getSortKeys();
        	if (skeys != null)
        	{
        		
       			for (SortKey sortKey : skeys)
       			{
       				int columnIndex = table.convertColumnIndexToModel(sortKey.getColumn());

       				//if (col == sortKey.getColumn())
       				if (col == columnIndex)
       				{
       					if(sortKey.getSortOrder() == SortOrder.ASCENDING)
       					{
       						setIcon(mAscending);
       						return this;
       					}
       					else if (sortKey.getSortOrder() == SortOrder.DESCENDING)
       					{
       						setIcon(mDescending);
       						return this;
       					}
       				}
       			}
       		}
        	setIcon(mNull);
        	return this;
        }
    }
    
    public class NullIcon implements Icon
    {
        public int getIconHeight()
        {
            return 6;
        }

        public int getIconWidth()
        {
            return 6;
        }

        public void paintIcon(Component pComponent, Graphics pGraphics, int pX, int pY)
        {
        }
    }
    
    public class AscendingIcon extends NullIcon
    {
        public void paintIcon(Component pComponent, Graphics pGraphics, int pX, int pY)
        {
            int[] xx = {pX, pX + 3, pX + 6};
            int[] yy = {pY + 6, pY, pY + 6};

            Color initialColor = pGraphics.getColor();
            float[] initial = Color.RGBtoHSB(initialColor.getRed(), initialColor.getGreen(), initialColor.getBlue(), null);
            boolean need = initial[2] < .5f;
            initial[2] = invertAsNeed(initial[2], need);

            Color line = Color.getHSBColor(initial[0], initial[1], invertAsNeed(initial[2] * .7f, need));
            Color fill = Color.getHSBColor(initial[0], initial[1], invertAsNeed(initial[2] * .35f, need));
            pGraphics.setColor(fill);
            pGraphics.fillPolygon(xx, yy, 3);
            pGraphics.setColor(line);
            pGraphics.drawPolygon(xx, yy, 3);
        }
        
        private float invertAsNeed(float pBright, boolean pNeed)
        {
            return pNeed ? 1 - pBright : pBright;
        }
    }
    
    public class DescendingIcon extends NullIcon {
       public void paintIcon(Component pComponent, Graphics pGraphics, int pX,
                int pY) {
            int[] xx = {pX, pX + 3, pX + 6};
            int[] yy = {pY, pY + 6, pY + 0};

            Color initialColor = pGraphics.getColor();
            float[] initial = Color.RGBtoHSB(initialColor.getRed(),
                    initialColor.getGreen(), initialColor.getBlue(), null);

            boolean need = initial[2] < .5f;
            initial[2] = invertAsNeed(initial[2], need);

            Color line = Color.getHSBColor(initial[0], initial[1],
                    invertAsNeed(initial[2] * .7f, need));
            Color fill = Color.getHSBColor(initial[0], initial[1],
                    invertAsNeed(initial[2] * .35f, need));
            pGraphics.setColor(fill);
            pGraphics.fillPolygon(xx, yy, 3);
            pGraphics.setColor(line);
            pGraphics.drawPolygon(xx, yy, 3);
        }
        
        private float invertAsNeed(float pBright, boolean pNeed)
        {
            return pNeed ? 1 - pBright : pBright;
        }
    }
}
 

mrsmola

Mitglied
Ich habe mich etwas zu früh gefreut. Irgendwie ist doch noch der Wurm drin. ???:L

Beispiel ohne ResortingColumnModelListener:

Spalte A und B sind sortiert. Dann schiebe ich Spalte D vor Spalte A.

Reihenfolge vorher: ABCD (Sortierschlüssel: AB)
1. Zwischenschritt: ADBC (Sortierschlüssel: AC)
Ende der Vertauschung: DABC ( Sortierschlüssel: DC)

Erhofft hatte ich nach dem Ende der Vertauschung die Sortierschlüssel (AB).


Beispiel mit ResortingColumnModelListener:
Spalte A und B sind sortiert. Dann schiebe ich Spalte D vor Spalte A.

Reihenfolge vorher: ABCD (Sortierschlüssel: AB)
1. Zwischenschritt: ADBC (Sortierschlüssel: AD)
Ende der Vertauschung: DABC ( Sortierschlüssel: AD)

Erhofft hatte ich nach dem Ende der Vertauschung die Sortierschlüssel (AB).
 

Marco13

Top Contributor
Oh ja - das convertColumnIndexToModel in dem Schnipsel oben müßte convertColumnIndexToView sein - wenn's das jetzt nicht ist, schaue ich heute Abend nochmal genauer... :oops:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L JavaFX TableView Column Sortierung AWT, Swing, JavaFX & SWT 1
T Problem mit JTable Sortierung AWT, Swing, JavaFX & SWT 2
D Sortierung in der einfach-verketteten Listen AWT, Swing, JavaFX & SWT 13
D Sortierung von Umlauten in einer JTable AWT, Swing, JavaFX & SWT 5
N Swing JTable mit Sorter: Keine Sortierung bei Klick in Header AWT, Swing, JavaFX & SWT 3
B Probleme bei Sortierung einer Tabelle mit DefaultTableModel AWT, Swing, JavaFX & SWT 6
S JTable - Sortierung beibhalten / Speichern. AWT, Swing, JavaFX & SWT 3
M JTable Sortierung - -zeilenweise mit Objekten verknüpfen AWT, Swing, JavaFX & SWT 4
C [SWT] Widget Table verliert nach Sortierung farbige / eingefärbter Background / Zellen AWT, Swing, JavaFX & SWT 3
L Swing Falscher Wert nach eigener Sortierung (JTable) AWT, Swing, JavaFX & SWT 2
G DefaultCategoryDataset sortierung von columnKey AWT, Swing, JavaFX & SWT 2
D Liste mit Tabellenkopf, Sortierung usw. AWT, Swing, JavaFX & SWT 2
J Daten in JTable nach Sortierung auslesen AWT, Swing, JavaFX & SWT 2
hdi Swing JTable - multiple Sortierung AWT, Swing, JavaFX & SWT 4
V JTable: Sortierung einer Spalte zum Programmstart? AWT, Swing, JavaFX & SWT 3
GilbertGrape JTable Sortierung. AWT, Swing, JavaFX & SWT 10
P JTable:Sortierung nach der Zeit/Spalte mit Calendar-Objekten AWT, Swing, JavaFX & SWT 2
D Sortierung beim Klicken auf Header einer JdbTable verhindern AWT, Swing, JavaFX & SWT 3
M Spaltenbreite mit Sortierung AWT, Swing, JavaFX & SWT 3
S JList gibt nach Sortierung mit Collections keine Anzahl mehr AWT, Swing, JavaFX & SWT 3
L Falsche Zeile gelöscht nach Spalte Sortierung in JTable AWT, Swing, JavaFX & SWT 2
J JTable Sortierung AWT, Swing, JavaFX & SWT 18
B Sortierung der ColumnHeader AWT, Swing, JavaFX & SWT 8
N Sortierung einer JTable AWT, Swing, JavaFX & SWT 2
S Sortierung in JTable? AWT, Swing, JavaFX & SWT 8
L JComponents vertauschen AWT, Swing, JavaFX & SWT 2
S Swing Plätze von 2 panels vertauschen AWT, Swing, JavaFX & SWT 4
R Swing JLayeredPane - Drag&Drop Positionen vertauschen AWT, Swing, JavaFX & SWT 3
Student JTable - Zeilen und Spalten vertauschen AWT, Swing, JavaFX & SWT 4
Encera TableView Zeilen als Spalten im SceneBuilder AWT, Swing, JavaFX & SWT 0
W JavaFX JavaFX - Spalten auf ganze SpreadsheetView verteilen AWT, Swing, JavaFX & SWT 16
H automatische Anzahl der Spalten ermitteln -> geht nicht AWT, Swing, JavaFX & SWT 6
ralfb1105 JavaFX Dynamisch TableView Spalten erstellen AWT, Swing, JavaFX & SWT 4
L JavaFX Gridpane mit gleich großen Spalten AWT, Swing, JavaFX & SWT 23
K TreeTableView (cellFactory) - wie Daten in Spalten einfügen AWT, Swing, JavaFX & SWT 0
H TableView mit variabler Anzahl Spalten AWT, Swing, JavaFX & SWT 2
R Swing JTable : Header der Spalten ergänzen mit caption (wie bei html-table) AWT, Swing, JavaFX & SWT 2
S JComboBox mit mehreren Spalten? AWT, Swing, JavaFX & SWT 6
D Swing Bestimmte Berechnung von Spalten durchführen und dann die Zeilen nach bestimmten Kriterien einfärben AWT, Swing, JavaFX & SWT 5
K JavaFX Spalten der Tabellen verschieben AWT, Swing, JavaFX & SWT 2
W JTable erstellen und Spalten sortieren AWT, Swing, JavaFX & SWT 2
I JTable Spalten automatisch dem Inhalt anpassen! AWT, Swing, JavaFX & SWT 6
O Swing Spalten-Position nach verschieben AWT, Swing, JavaFX & SWT 6
M JTable mit wechselnden Spalten - sehr Langsam AWT, Swing, JavaFX & SWT 5
O Swing JTable spalten sollen Links stehen AWT, Swing, JavaFX & SWT 5
T Spaltengröße einzelner Spalten in Gridlayout festlegen AWT, Swing, JavaFX & SWT 3
M Swing JTable - Umsortieren einzelner Spalten unterbinden AWT, Swing, JavaFX & SWT 6
D Problem mit 3-Spalten Layout AWT, Swing, JavaFX & SWT 17
J Swing JTable: Komplette Zeile aber ohne Spalten markieren AWT, Swing, JavaFX & SWT 11
B JFileChooser breite der Spalten? AWT, Swing, JavaFX & SWT 5
P Liste mit Icons und mehreren Spalten AWT, Swing, JavaFX & SWT 7
B JTable Zeilen und Spalten selektieren AWT, Swing, JavaFX & SWT 5
G LayoutManager Layout für Spalten AWT, Swing, JavaFX & SWT 8
I jList mit Spalten AWT, Swing, JavaFX & SWT 3
G Swing JTextArea mit fester Anzahl Spalten! AWT, Swing, JavaFX & SWT 10
C [Swing] JList JText 2 Spalten Modell prozentual verteilen AWT, Swing, JavaFX & SWT 2
D JTabel: Überschrift, Abstand zwischen Tabellen, Spalten-Farbe ändern AWT, Swing, JavaFX & SWT 2
B Swing GridLayout.add über 2 Spalten? AWT, Swing, JavaFX & SWT 7
F Spalten in JTable immer am rechten Tabellenrand AWT, Swing, JavaFX & SWT 3
B Swing JTable Spalten namen AWT, Swing, JavaFX & SWT 10
E Swing JTable Spalten ausblenden?! AWT, Swing, JavaFX & SWT 3
T jTable und farbige Spalten AWT, Swing, JavaFX & SWT 18
P GridBagLayout - zwei Spalten mit gleicher Größe AWT, Swing, JavaFX & SWT 11
B Swing JTable mit scrollbalken anhand von Spalten AWT, Swing, JavaFX & SWT 3
B Swing JTable Spalten merken AWT, Swing, JavaFX & SWT 6
E JTable nach mehreren Spalten sortieren AWT, Swing, JavaFX & SWT 14
B SWT SWT Tree mit mehreren Spalten AWT, Swing, JavaFX & SWT 3
F Swing J(X)Table Spalten umsortieren NUR im View (Wie finde ich eine Spalte nach Name?) AWT, Swing, JavaFX & SWT 3
H Swing TableCellRenderer für verschiedene Spalten AWT, Swing, JavaFX & SWT 11
J Swing JComboBox mit mehreren Spalten AWT, Swing, JavaFX & SWT 4
D Layout 2 unterschiedliche spalten AWT, Swing, JavaFX & SWT 7
S Swing JTable: Spalten mit relativer Breite im ungleichmäßigen Verhältnis AWT, Swing, JavaFX & SWT 2
G Tabelle Spalten unsichtbar machen AWT, Swing, JavaFX & SWT 5
D JTable Viewport - Ausgabe der sichtbaren Spalten AWT, Swing, JavaFX & SWT 2
K JTable Spalten nicht verschieben AWT, Swing, JavaFX & SWT 2
G JTable fixierte Spalten AWT, Swing, JavaFX & SWT 2
G TableModel mit anderen Spalten AWT, Swing, JavaFX & SWT 4
G JTable: Spalten & Zellen fixieren wie in Excel AWT, Swing, JavaFX & SWT 4
Tom299 JTable - Spalten verschieben deaktivieren? AWT, Swing, JavaFX & SWT 3
K kopf einer tabelle über mehrere spalten AWT, Swing, JavaFX & SWT 3
M JFace TableViewer + ContentProvider, wo sind die Spalten? AWT, Swing, JavaFX & SWT 6
E Spalten Farbe ändern AWT, Swing, JavaFX & SWT 3
ARadauer spalten überschriften von jtable sehr klein AWT, Swing, JavaFX & SWT 2
N JComboBox mit mehreren Spalten AWT, Swing, JavaFX & SWT 21
M JDBC + dynamischer JTable - Spalten problem AWT, Swing, JavaFX & SWT 5
O JTable, mehrere Spalten drucken AWT, Swing, JavaFX & SWT 4
B JTable mehrere Spalten | wird nicht angezeigt AWT, Swing, JavaFX & SWT 5
N JTable Abstand zwischen einzelnen Spalten AWT, Swing, JavaFX & SWT 6
B Eine Spalte in drei verschiedenlange Spalten aufteilen AWT, Swing, JavaFX & SWT 2
J Zwei-Spalten Layout [Swing] AWT, Swing, JavaFX & SWT 3
A Bestimmte Spalten nicht editierbar machen AWT, Swing, JavaFX & SWT 6
S JTable - Spalten fixieren AWT, Swing, JavaFX & SWT 11
X JTable --> Anzahl der Spalten ändern AWT, Swing, JavaFX & SWT 8
L Tabelle mit 5 spalten und 2 Zeilen erzeugen AWT, Swing, JavaFX & SWT 4
R JList mit zwei Spalten AWT, Swing, JavaFX & SWT 2
N Beim Ziehen der Spalten immer ArrayIndexOutOfBoundsException AWT, Swing, JavaFX & SWT 4
T JList mit mehreren spalten AWT, Swing, JavaFX & SWT 2
borobudur zwei Spalten-Titeln bei JTable AWT, Swing, JavaFX & SWT 2
V Bestimmte Spalten im JTable nicht anzeigen AWT, Swing, JavaFX & SWT 2
L Header von ausgewählte Spalten ausgeben AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben