Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Řazení v JTable

Ahoj všichni chtěl bych vás poprosit o radu, dělám do školy takovou práci, je to v podstatě databáze dělaná v Javě v Eclipsu, potřeboval bych pomoct s řazením věcí v tabulce. Tabulka se mi načítá ze souboru txt který je u toho ve zdrojích a já bych potřeboval nějak filtrovat když něco vyberu z comboboxu a taky řadit například podle abecedy nebo ceny, myslíte že byste mi mohli poradit??? předem díky za odpověď.

loading...
Předmět Autor Datum
http://www.java2s.com/Tutorial/Java/0240__Swing/Ta blerowfilerandsortkey.htm
MaSo 19.05.2011 13:48
MaSo
Díky ale jsem začátečník a trochu se v tom nevyznám....filtr dobrej podle ceny už si to srovnám ale…
Vrata333 19.05.2011 13:56
Vrata333
a taky nevim jak udělám tu cenu od/do protože ji tam mám v txt jako String a nevim jak udělat ten ro…
Vrata333 19.05.2011 13:58
Vrata333
Taxi tu cenu konveruj na double. Double.parseDouble()
MaSo 19.05.2011 14:04
MaSo
Nějak mi to stejně nefunguje jak to čte z toho souboru tak bych musel podle toho odkazu předělat cel…
Vrata333 19.05.2011 14:28
Vrata333
Tak ukaž, co už máš...
MaSo 19.05.2011 14:38
MaSo
já to mám v tom hlavnim okně ji tvořim JTable table = new JTable(); String[] columnNames = new Stri…
Vrata333 19.05.2011 15:05
Vrata333
myslim že se v tom vyzná jen frajer :DDDD když to netvoří :D
Vrata333 19.05.2011 15:06
Vrata333
a ty motorky jsou uložený v tom txt souboru
Vrata333 19.05.2011 15:11
Vrata333
LOL! Tohle jsi nepsal ty, ale já: http://pc.poradna.net/q/view/651520-nacitani-ze-so uboru-do-jtable
MaSo 19.05.2011 17:24
MaSo
no vidiš ani by mě to nenapadlo děláme s kámošem týmovou práci a tak to mám od něj ale fakt nevim ja…
Vrata333 19.05.2011 18:59
Vrata333
Hmm... a to mám vaši "teamovou" práci udělat já? Trochu vlastního zapojení by to chtělo...
MaSo 19.05.2011 20:52
MaSo
upřímně to co si nám poradil je ani ne desetina tý práce jestli nechceš tak dík moc proč vůbec píšeš…
Vrata333 19.05.2011 21:41
Vrata333
Mám zájem pomoct, ale taky se nemůžu zbavit dojmu, že vy nemáte zájem se nic naučit. Chcete jen, aby…
MaSo 20.05.2011 10:37
MaSo
Tenhle semestr jsem se toho naučil docela dost a fakt je to jen zlomek kterej fakt dělá nepořádek a…
Vrata333 20.05.2011 11:01
Vrata333
A stim co jsi mi poslal mám právě problém to tam napasovat když to čte ze souboru, víš jak jsem psal…
Vrata333 20.05.2011 11:04
Vrata333
tak už není potřeba to řešit. Udělal jsem to úplně jinak, přes dočasný soubor, do kterýho se nahrajo…
ocajda 20.05.2011 12:48
ocajda
LOL :-D
MaSo 20.05.2011 13:36
MaSo
aspoň jsem to vyřešil sám :-)
ocajda 20.05.2011 19:23
ocajda
To jo, ale na to, že stačilo přidat tři řádky kódu...:-)
MaSo 21.05.2011 01:06
MaSo
já práve nikdy na nic snadnýho nepřijdu a vymýšlím okliky :-D
ocajda 21.05.2011 09:44
ocajda
Zdravím, omlouvám se za otevření tématu, nicméně je otevřené :). Bylo by prosím možné odtajnit tři…
Mihh 18.05.2012 22:46
Mihh
Nečetl jsem celou diskuzi - ale pokud čteš data z txt, tak bych je uložil do pole a použil příkaz so…
host 18.05.2012 22:51
host
Uniklo ti to, že kolega to chce v Javě...
MaSo 18.05.2012 23:28
MaSo
Ano, Java. Jde o to, že Ty tam máš Vector - což je, pokud se nemýlím, nějaká forma seznamu - ale ne…
Mihh 19.05.2012 00:11
Mihh
Musíš přesně popsat, co potřebuješ a ideálně to podpořit nějakým kusem kódu, který už máš. Chápu, že…
MaSo 19.05.2012 00:37
MaSo
Já potřebuju aby JTable se objevila už seřazená dle skore.(Highscore) Případně jsem nahrál sem(pak t…
Mihh 19.05.2012 01:14
Mihh
Nejjednodušší řešení, které není vůbec optimalizované pro výkon. Po každém vložení nebo odebraní z…
MaSo 19.05.2012 02:36
MaSo
Věřím (když to máte v povědomí), 10 minut - no pro mě zatím rozohdně ne. Po 2 hodinách jsem se pokou…
Mihh 19.05.2012 14:09
Mihh
Nějak tak...
MaSo 19.05.2012 21:35
MaSo
Ještě jeden dotaz než přestanu otravovat. Jak to seřadit opačně? Mělo by to jít touto metodou: http…
Mihh 20.05.2012 21:57
Mihh
Mělo by stačit upravit Comparator ve třídě SkoreNacitac takto: SortedList<Skore> vypisSkore = new S…
MaSo 21.05.2012 10:31
MaSo
Jak jinak, funguje krásně. Díky moc. Příště to vezmu raději více od země.
Mihh 21.05.2012 11:07
Mihh
Hmmmm, tak ne. Nějakou blbou náhodou jsem měl sestupně zapsané data v tom txt, což mi nedošlo. Zkrá…
Mihh 21.05.2012 12:02
Mihh
SkoreNacitac.java package logika; import java.awt.List; import java.io.File; import java.io.FileNot…
MaSo 21.05.2012 18:05
MaSo
Jo jo, už taky řadí. Program nějak stávkoval či co. Kody vedle sebe, rozdíl = 0, ale nějak se to po… poslední
Mihh 21.05.2012 19:22
Mihh

já to mám v tom hlavnim okně ji tvořim

JTable table = new JTable();
String[] columnNames = new String[] { "Značka", "Obsah", "Barva", "Cena"};
table.setModel(new MotorkaTableModel(columnNames));
JScrollPane pane = new JScrollPane(table);
hlavniOknoFrame.add(pane);

tady odkazuju na MotorkaTableModel

import java.util.Vector;
import javax.swing.table.AbstractTableModel;
import logika.Motorka;
import logika.MotorkaParser;


public class MotorkaTableModel extends AbstractTableModel {
	public static final int ZNACKA_INDEX = 0;
	public static final int OBSAH_INDEX = 1;
	public static final int BARVA_INDEX = 2;
	public static final int CENA_INDEX = 3;

	protected String[] columnNames;
	protected Vector<Motorka> dataVector;

	public MotorkaTableModel(String[] columnNames) {
		this.columnNames = columnNames;
		dataVector = MotorkaParser.parseFile("motorky.txt");
	}

	public String getColumnName(int column) {
		return columnNames[column];
	}

	public boolean isCellEditable(int row, int column) {
		return true;
	}

	public Class getColumnClass(int column) {
		switch (column) {
		case ZNACKA_INDEX:
		case BARVA_INDEX:
			return String.class;
		case OBSAH_INDEX:
			return Integer.class;
		case CENA_INDEX:
			return Integer.class;
		default:
			return Object.class;
		}

	}

	public Object getValueAt(int row, int column) {
		Motorka m = dataVector.get(row);

		switch (column) {
		case ZNACKA_INDEX:
			return m.getZnacka();
		case BARVA_INDEX:
			return m.getBarva();
		case OBSAH_INDEX:
			return m.getObsah();
		case CENA_INDEX:
			return m.getCena();
		default:
			return new Object();
		}
	}

	public void setValueAt(Object value, int row, int column) {
		Motorka m = dataVector.get(row);

		switch (column) {
		case ZNACKA_INDEX:
			m.setZnacka((String) value);
			break;
		case BARVA_INDEX:
			m.setBarva((String) value);
			break;
		case OBSAH_INDEX:
			m.setObsah((Integer) value);
			break;
		case CENA_INDEX:
			m.setCena((Integer) value);
			break;
		default:
			System.out.println("invalid index");
		}
		fireTableCellUpdated(row, column);

	}

	public int getRowCount() {
		return dataVector.size();
	}

	public int getColumnCount() {
		return columnNames.length;
	}

	public boolean hasEmptyRow() {
		return false;
	}

	public void addEmptyRow() {
		dataVector.add(new Motorka("", 0, "", 0));
		fireTableRowsInserted(dataVector.size() - 1, dataVector.size() - 1);
	}
}

a tady je ještě odkaz na MotorkaParser

package logika;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.Vector;

public class MotorkaParser {

	public static Vector<Motorka> parseFile(String filename) {
		Vector<Motorka> motorky = new Vector<Motorka>();

		File file = new File(filename);

		try {

			Scanner scanner = new Scanner(file);
			while (scanner.hasNextLine()) {
				String line = scanner.nextLine();
				String[] split = line.split(" ");
				motorky.add(new Motorka(split[0], Integer.parseInt(split[1]),
						split[2], Integer.parseInt(split[3])));

			}
		} catch (ArrayIndexOutOfBoundsException e) {
			e.printStackTrace();
		} catch (NumberFormatException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}

		return motorky;
	}

}

a tady je základ ta třída Motorka

public class Motorka
{
	private String znacka;
	private int obsah;
	private String barva;
	private int cena;
   
    
	public Motorka(String znacka, int obsah, String barva, int cena) {
		this.znacka = znacka;
		this.obsah = obsah;
		this.barva = barva;
		this.cena = cena;
	}


   
    public void print()
    {
        System.out.println("    " + getZnacka());
        System.out.println("    " + getObsah());
        System.out.println("    " + getBarva());
        System.out.println("    " + getCena());
    }
    
    
    
    public String getZnacka() {
		return znacka;
	}

	public int getObsah() {
		return obsah;
	}

	public String getBarva() {
		return barva;
	}

	public int getCena() {
		return cena;
	}

	public void setZnacka(String znacka) {
		this.znacka = znacka;
	}

	public void setObsah(int obsah) {
		this.obsah = obsah;
	}

	public void setBarva(String barva) {
		this.barva = barva;
	}

	public void setCena(int cena) {
		this.cena = cena;
	}
}

Tenhle semestr jsem se toho naučil docela dost a fakt je to jen zlomek kterej fakt dělá nepořádek a nemůžem na něj přijít, věř mi že je v tý práci toho hodně na co jsme přišli sami a je to 95% tý práce, fakt mi nejde o to to jen opsat a navíc potřebný body abych zvládl tenhle předmět už mám takže je to stejně v podstatě jen pro zábavu

Zdravím,

omlouvám se za otevření tématu, nicméně je otevřené :).

Bylo by prosím možné odtajnit tři řádky kódu, potřeboval bych něco obdobného.(Trochu jsem se inspiroval zde zmíněným projektem.)

Zapisuju do txt, pak ho čtu, načte se, OK. Ale jak to seřadit?

Něco jako toto: http://www.esus.com/docs/GetQuestionPage.jsp?uid=1 270 ... ale bez klikání, zobrazení jtabel již seřazené dle skore.(Ukládám jméno hráče a jeho skore = 2 sloupce -> řazení dle skore)

Nerad bych bez pochopení něco někam "házel", zde zmíněnému rozumím - rád bych to viděl přím na tom(je-li to možné).

Předem díky, M.

Ano, Java.

Jde o to, že Ty tam máš Vector - což je, pokud se nemýlím, nějaká forma seznamu - ale ne pole, na které jde použít sort.

A já už poměrně dlouho dobu nad tím tápu.(Pokoušel jsem se to předělat na pole, moc s pravýma polema neumím manipulovat, takže jsem to brzo vzdal & uvedení návodu do praxe nedopadlo o moc lépe.(a bylo tak minimálně na 100 řádků :D))

Nicméně pokud se nemýlím, tak při čtení to zařazuješ jako "tam" Motorku, tudíž si rozděluješ, co je co a případně kolik, takže řazení by mohlo probíhat někde při čtení. Ale to už zase někam musíš asi někam ukládat - ale hýbat se musí celé řádky, čím víc nad tím přemýšlím - tím je guláš hustší.

Já potřebuju aby JTable se objevila už seřazená dle skore.(Highscore)
Případně jsem nahrál sem(pak to bude hned jasné): src-zip
Je to spustitelné a fční, jen třeba upravit cestu k souboru.

Mám txt, např.:

Ovechkin 949
Malkin 747
Hemský 848

Třídu Score - s konstruktorem(String jmeno & int skore), gety a sety.
Třídu SkoreNacitac - kterou jsem si vypůjčil od Tebe - MotorkaParser.
Třídu: OknoNoveSkore - GUI + po zmáčknutí tlačítka => se zapíše zapsané jméno a skore na novy radek v txt.
Třídu OknoVysledkuSkore:

public class OknoVysledkuSkore extends JFrame {

	private JTable tabulka = new JTable();

	public OknoVysledkuSkore() {
		setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
		tabulka.setModel(new ModelSkore());
		JScrollPane pane = new JScrollPane(tabulka);
		getContentPane().add(pane);
		tabulka.setShowVerticalLines(true);
		tabulka.setShowHorizontalLines(true);
		pack();
		setVisible(true);
		setTitle ("Nejvyšší skóre");
		setSize(400, 300);
	}

	public static void main(String[] args) {
		new OknoVysledkuSkore();
		new OknoNoveSkore();
	}
}

Další třída: ModelSkore nastavuje obsah OknoVysledkuSkore .

package grafika;
import ...
public class ModelSkore extends AbstractTableModel {
	public static final int HRAC_INDEX = 0;
	public static final int SKORE_INDEX = 1;

	protected Vector<Skore> dataVector;

	public ModelSkore() {
		dataVector = SkoreNacitac.parseFile("D:/score.txt"); //WTF - relativní ?...
	}

	public String getColumnName(int sloupec) {
		switch (sloupec) {
		case 0: 
			return "Jméno";
		case 1: 
			return "Skóre";
		default: 
			return "";
		}
	}

	public boolean isCellEditable(int radek, int sloupec) {
		return false;
	}

	public Class getColumnClass(int sloupec) {
		switch (sloupec) {
		case HRAC_INDEX:
			return String.class;
		case SKORE_INDEX:
			return Integer.class;
		default:
			return Object.class;
		}

	}

	public Object getValueAt(int radek, int sloupec) {
		Skore skore12 = dataVector.get(radek);
		switch (sloupec) {
		case HRAC_INDEX:
			return skore12.getJmenoHrace();
		case SKORE_INDEX:
			return skore12.getHracovoSkore();
		default:
			return new Object();
		}
	}

	public int getRowCount() {
		/*
		if(dataVector.size() > 10){
			dataVector.setSize(10);
		}
		*/
		return dataVector.size();
	}

	public int getColumnCount() {
		return 2;
	}

	public boolean hasEmptyRow() {
		return false;
	}

	public void addEmptyRow() {
		dataVector.add(new Skore("", 0));
		fireTableRowsInserted(dataVector.size() - 1, dataVector.size() - 1);
	}
	
	public void setridSkore() {
		;
	}
}

M.

Nejjednodušší řešení, které není vůbec optimalizované pro výkon.

Po každém vložení nebo odebraní z toho Vectoru, zavolej Collections.sort() s Comparatorem implementovaným tak, aby řadil podle toho Integeru (stačí vracet výsledek metody compare u Integeru). Tohle bys měl mít hotové za 10 min. Kód ti momentálně žádný nevypotím, jsem už dost společensky unaven.

Když tak později (rozuměj až se vyspím)...:-)

Věřím (když to máte v povědomí), 10 minut - no pro mě zatím rozohdně ne. Po 2 hodinách jsem se pokoušel dataVector narvat do Collections, tam nějak sortovat, a zase zpátky to předat do dataVector. No, fiasko na entou.

Zkrátka bych prosil návod pro tydýty.

Mělo by stačit upravit Comparator ve třídě SkoreNacitac takto:

SortedList<Skore> vypisSkore = new SortedList<Skore>(new Comparator<Skore>() {

@Override
public int compare(Skore o1, Skore o2) {
    return (new Integer(o1.getHracovoSkore()).compareTo(new Integer(o2.getHracovoSkore()))) * (-1);
}});

PS: ještě si tam doplň ify, jestli o1 a o2 nejsou null, aby to někdy nepadalo na NullPointer...

Hmmmm, tak ne.
Nějakou blbou náhodou jsem měl sestupně zapsané data v tom txt, což mi nedošlo.

Zkrátka:

return  new Integer(o1.getHracovoSkore()).compareTo(new Integer(o2.getHracovoSkore()) * (new Integer(1))); // bez -

funguje(řadí vzestupně), ale

return  new Integer(o1.getHracovoSkore()).compareTo(new Integer(o2.getHracovoSkore()) * (new Integer(-1)));

nedělá k překvapení ale vůbec nic.(Jen se načtou data z txt)

Ale když nad tím přemýšlím, tak i s (-1) by se to mělo řadit stejně, -3333 je více než -6666.
Ještě mě napadlo to převést na Double a vynásobit to 1/100000 ... ale taky nic nedělá.

SkoreNacitac.java

package logika;


import java.awt.List;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Comparator;
import java.util.Scanner;

/*******************************************************************************
 * Trida SkoreNacitac -  trida nacita data ze souboru do vypisSkore(jako Skore(trida)), tedy do tabulky skore.
 * 
 * @author    Michal Hron
 * @version   18.05.2012
 */
public class SkoreNacitac {

	public static SortedList<Skore> parseFile(String nazevSouboru) {
		SortedList<Skore> vypisSkore = new SortedList<Skore>(new Comparator<Skore>() {
            @Override
            public int compare(Skore o1, Skore o2) {
                return  (new Integer(o1.getHracovoSkore()).compareTo(new Integer(o2.getHracovoSkore()))) * (-1);
            }
        });

		File file = new File(nazevSouboru);

		try {

			Scanner scanner = new Scanner(file);
			while (scanner.hasNextLine()) {
				String line = scanner.nextLine();
				String[] split = line.split(" ");
				vypisSkore.add(new Skore(split[0], Integer.parseInt(split[1])));
			}
			
		} catch (ArrayIndexOutOfBoundsException e) {
			e.printStackTrace();
		} catch (NumberFormatException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}

		return vypisSkore;
	}

}

skore.txt

Vajco 1
Mihh 6453
Ovechkin 6451
Erat 6452
Radivojevi 6455
dfaadsf 7459
safasdf 458

Se mi seřadí správně...

Zpět do poradny Odpovědět na původní otázku Nahoru

loading...