Probleme bei sortieren von jTable

  • Themenstarter Themenstarter KlemensyXYZ
  • Beginndatum Beginndatum
K

KlemensyXYZ

Gast
Hallo,

ich möchte folgende Tabelle für eine Rangliste nach der Höhe der Punkte sortieren:
Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * Rangliste.java
 *
 * Created on 02.11.2011, 17:43:49
 */

package rangliste;

import java.awt.Image;
import java.util.Comparator;

import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

/**
 *
 * @author Klemens
 */
@SuppressWarnings("serial")
public class Rangliste extends javax.swing.JFrame {
	
	String Sp1Name;	//bekommen noch Werte zugeordnet
	int SP1Punkte;
	String Sp1Datum;
	String Sp2Name;
	int SP2Punkte;
	String Sp2Datum;
	String Sp3Name;
	int SP3Punkte;
	String Sp3Datum;
	String Sp4Name;
	int SP4Punkte;
	String Sp4Datum;
	String Sp5Name;
	int SP5Punkte;
	String Sp5Datum;
	String Sp6Name;
	int SP6Punkte;
	String Sp6Datum;
	String Sp7Name;
	int SP7Punkte;
	String Sp7Datum;
	String Sp8Name;
	int SP8Punkte;
	String Sp8Datum;
	String Sp9Name;
	int SP9Punkte;
	String Sp9Datum;
	String Sp10Name;
	int SP10Punkte;
	String Sp10Datum;

    /** Creates new form Rangliste */
    public Rangliste() {
    	super("Rangliste");
        java.net.URL iconUrl = this.getClass().getResource("/rangliste/Chart.png");
    	Image img = getToolkit().getImage(iconUrl); 
    	setIconImage(img);
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();
        SchliessenButton = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

        jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/rangliste/Chart.png"))); // NOI18N

        jLabel2.setFont(new java.awt.Font("Tahoma", 0, 36));
        jLabel2.setText("Rangliste");

        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {new Integer(1), Sp1Name, SP1Punkte, Sp1Datum},
                {new Integer(2), Sp1Name, SP1Punkte, Sp1Datum},
                {new Integer(3), Sp1Name, SP1Punkte, Sp1Datum},
                {new Integer(4), Sp1Name, SP1Punkte, Sp1Datum},
                {new Integer(5), Sp1Name, SP1Punkte, Sp1Datum},
                {new Integer(6), Sp1Name, SP1Punkte, Sp1Datum},
                {new Integer(7), Sp1Name, SP1Punkte, Sp1Datum},
                {new Integer(8), Sp1Name, SP1Punkte, Sp1Datum},
                {new Integer(9), Sp1Name, SP1Punkte, Sp1Datum},
                {new Integer(10), Sp1Name, SP1Punkte, Sp1Datum}
            },
            new String [] {
                "Nr.", "Name", "Punkte", "Datum"
            }
        ) {
            @SuppressWarnings("rawtypes")
			Class[] types = new Class [] {
                java.lang.Integer.class, java.lang.String.class, java.lang.Integer.class, java.lang.String.class
            };
            boolean[] canEdit = new boolean [] {
                false, false, false, false
            };

            @SuppressWarnings("rawtypes")
			public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        jTable1.setColumnSelectionAllowed(true);
        jScrollPane1.setViewportView(jTable1);
        
        TableRowSorter<TableModel> rowSorter = new TableRowSorter<TableModel>( model ); //Wie bekommt man hier das richtige Model rein?
        jTable1.setRowSorter( rowSorter );
        rowSorter.setComparator( 2, new Comparator<Integer>() 
        {   
        	public int compare( Integer Punkte1, Integer Punkte2 )
        	{     
        		int i1 = Punkte1, i2 = Punkte2;
        		return (Integer.bitCount( i1 ) - Integer.bitCount( i2 ));
        	} 
        } ); 

        SchliessenButton.setText("Schließen");
        SchliessenButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                SchliessenButtonActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabel1)
                        .addGap(18, 18, 18)
                        .addComponent(jLabel2))
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)
                    .addComponent(SchliessenButton, javax.swing.GroupLayout.Alignment.TRAILING))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jLabel1))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(19, 19, 19)
                        .addComponent(jLabel2)))
                .addGap(18, 18, 18)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 187, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(SchliessenButton)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

    private void SchliessenButtonActionPerformed(java.awt.event.ActionEvent evt) {                                                 
        // TODO add your handling code here:
    	this.dispose();
    }                                                

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Rangliste().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JButton SchliessenButton;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
    // End of variables declaration

}

doch wie bekomme ich (siehe Kommentar im Quelltext) hier:
Code:
TableRowSorter<TableModel> rowSorter = new TableRowSorter<TableModel>( model );
in meine Quelltext das Model rein?

ist der Rest sonst richtig?

Und kann man eine Tabelle bei mehr als 10 Einträgen irgendwie automatisch größer bekommen?

Danke
 
Du solltest zunächst anfangen mehrere Klassen zu verwendne und vor allem ins mvc einlesen. DU hast hier alles wild gemischt in einer Klasse, kein WUnder dass du dir dann irgendwann die Frage stellst mit dem Model.
Java:
 jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {new Integer(1), Sp1Name, SP1Punkte, Sp1Datum},
                {new Integer(2), Sp1Name, SP1Punkte, Sp1Datum},
                {new Integer(3), Sp1Name, SP1Punkte, Sp1Datum},
                {new Integer(4), Sp1Name, SP1Punkte, Sp1Datum},
                {new Integer(5), Sp1Name, SP1Punkte, Sp1Datum},
                {new Integer(6), Sp1Name, SP1Punkte, Sp1Datum},
                {new Integer(7), Sp1Name, SP1Punkte, Sp1Datum},
                {new Integer(8), Sp1Name, SP1Punkte, Sp1Datum},
                {new Integer(9), Sp1Name, SP1Punkte, Sp1Datum},
                {new Integer(10), Sp1Name, SP1Punkte, Sp1Datum}
            },
            new String [] {
                "Nr.", "Name", "Punkte", "Datum"
            }
        )

Da ist den Model. Erster Anfang wäre sicherlich das DefaultTableModel nicht direkt als anonyme innere Klasse zu verwenden, sondern herauszuziehen aus der setModel Methode.
Sp1Name usw haben in der Klasse "Frame" bzw generell in grafischen Klassen eig. nichts zu suchen, und Namenskonventionen hältst du auch nicht ein ;(
 
Da ist den Model. Erster Anfang wäre sicherlich das DefaultTableModel nicht direkt als anonyme innere Klasse zu verwenden, sondern herauszuziehen aus der setModel Methode.

das Model kommt (fast) genau so frisch aus dem GUI Generator von Netbeans 😛ueh:
wie sollte das denn aussehen?

Sp1Name usw haben in der Klasse "Frame" bzw generell in grafischen Klassen eig. nichts zu suchen, und Namenskonventionen hältst du auch nicht ein ;(

wie soll ich denn die Werte von Variablen sonst in die Tabelle bekommen?
das mit den Namen kann man ja noch ändern:autsch:
 
Zuletzt bearbeitet von einem Moderator:
wie soll ich denn die Werte von Variablen sonst in die Tabelle bekommen?
das mit den Namen kann man ja noch ändern

Zum Beispiel in dem du wie eRaaaa vorgeschlagen hat, das Model in eine extra Klasse extrahierst und dann über addRow() oder sonst was deinen Inhalt hinzufügst.
Dann hast du auch nich nur ein anonymes Model und kannst somit auch dein RowSorter hinzufügen.

How to Use Tables (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)
könnte hilfreich sein 😉

Automatisch größer bekommen?
setPreferredSize()
oder einfach ne ScrollPane benutzen??
 
Zum Beispiel in dem du wie eRaaaa vorgeschlagen hat, das Model in eine extra Klasse extrahierst und dann über addRow() oder sonst was deinen Inhalt hinzufügst.
Dann hast du auch nich nur ein anonymes Model und kannst somit auch dein RowSorter hinzufügen.
schön und gut :bahnhof: könntest du mir das auch als quelltext zeigen?
Automatisch größer bekommen?
setPreferredSize()
oder einfach ne ScrollPane benutzen??

mit größer meinte ich mehr Zeilen hinzufügen
 
Zuletzt bearbeitet von einem Moderator:
Da dein Google nicht zu funktionieren schein, bitte schön 😉

http://www.java-forum.org/java-basics-anfaenger-themen/69990-eigenes-tablemodel.html
How to Use Tables (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)
TableModel Example : TableSwing JFCJava
JTable and TableModel: FAQ


Und auch zum zweiten:
DefaultTableModel (Java 2 Platform SE v1.4.2)

Bitte gebe dir wenigstens ein bischen Mühe und lies etwas -.-
Google gibt zu dem Thema mehr als genug her!
lernt sich auch besser !!!

Vor allem setze dich mal mit der API auseinander, normalerweise steht da alles drinne!

Wenn du etwas konkretes nich verstehst, sags, aber ich schreib nich das halbe Programm für dich -.-
Ich helfe aber ansonsten gerne 😉
 
Zuletzt bearbeitet:

Zurück
Oben