Avatar
j.c
Člen
Avatar
j.c:

Mám tabulku jtable, naklikáno v Netbeans swing - interaktivní generátor formuláře.
Mám setAutoCreate­RowSorter zaškrtnuté.
Tabulka se při kliku na hlavičky sloupců pěkně třídí.
Bohužel, čísla INTEGER se třídí podle abecedy.
Na netu je řada příkladů jak to umravnit.
Třeba toto chodí:
http://stackoverflow.com/…-incorrectly
Popis chování zde:
http://docs.oracle.com/…wSorter.html
Ale to je vše pro případ, kdy vše píšete, a autoři zřejmě nepředpokládají, že by někdo používal interaktivní generátor formulářů.

A proto se obracím do tohoto fóra.
Jak zajistit korektní chování při použití generátoru formuláře?
V NetBeans vygenerovaném kódu vrací sloupce tabulky zřejmě nevhodné třídy getColumnClass.
Musím zřejmě někde zajistit, aby příslušné sloupce tabulky vracely odpovídající třídy getColumnClass.

A nebo úplně jinak? Děkuji za pomoc.

 
Odpovědět 10.3.2015 19:55
Avatar
Atrament
Člen
Avatar
Odpovídá na j.c
Atrament:

Vytvoř si vlastní třídu, která bude dědit od JTable a ve které bude metoda getColumnClass vracející správné datové typy a tu pak použij při návrhu toho formuláře místo JTable.

 
Nahoru Odpovědět 11.3.2015 10:45
Avatar
j.c
Člen
Avatar
Odpovídá na Atrament
j.c:

Díky. Jak jsem psal,ten formulář je naklikaný. Rodičovská třída je vidět, viz. výstřižek. Ale jak ji přepíšu? Zdá se mi, že toto pole je pro mne nepřístupné..

 
Nahoru Odpovědět 11.3.2015 12:23
Avatar
j.c
Člen
Avatar
Odpovídá na j.c
j.c:

Omlouvám se. Jsem nějaký pomalý ;). V systému, kde jsem pracoval doposud, jsem si mohl udělat vlastní knihovnu tříd. A pak své třídy (zde např. tu JTable přizpůsobenou) z knihovny tříd jen přetáhnout na formulář. Jde asi něco podobného i v netbeans, že? Podívám se po tom. Případně, že mně ještě postrčíte, budu rád a moc děkuji.

 
Nahoru Odpovědět 11.3.2015 12:33
Avatar
Atrament
Člen
Avatar
Odpovídá na j.c
Atrament:

Přesně tak to funguje i v Netbeans, prostě vytvoříš tu třídu (a hlavně zkompiluješ :) ) a pak ji jenom přetáhneš do formuláře kde ji chceš.

 
Nahoru Odpovědět 11.3.2015 12:42
Avatar
j.c
Člen
Avatar
Odpovídá na Atrament
j.c:

No právě tomu nerozumím. Vytvořit tu třídu nějak tak

 */
public class IntgTable extends JTable {
    public IntgTable() {
        DefaultTableModel model = new DefaultTableModel();
        TableRowSorter trs = new TableRowSorter(model);
        ...
        //trs.setComparator(0, new IntComparator());
        ...
        setRowSorter(trs);
        setAutoCreateRowSorter(false);
    }
}

není problém, ale jak ji "zvizualizovat", když nemá pod sebou formulář? A jak ji pak nacpat do palety? Vůbec se nechytám :(

 
Nahoru Odpovědět 11.3.2015 20:19
Avatar
j.c
Člen
Avatar
Odpovídá na j.c
j.c:

takže vytvoření "custom controlu" je prý jednoduché
https://docs.oracle.com/…ontrols.html

nic z toho ale není v mých NetBeans (které jsem kvůli tomu povýšil na EE), není to návod pro Eclipse?

 
Nahoru Odpovědět 11.3.2015 21:04
Avatar
Atrament
Člen
Avatar
Odpovídá na j.c
Atrament:

Na přidávání do palety kašli, prostě tu třídu IntgTable popadni v projekt exploreru a přetáhni ji na formulář v designeru, ona už se 'zvizualizuje' sama:)

 
Nahoru Odpovědět 11.3.2015 21:11
Avatar
j.c
Člen
Avatar
Odpovídá na Atrament
j.c:

jo ba, zrovna se mi to povedlo, jdu se sem pochlubit a .. pozdě :)

je to tak jednoduché, až to šokuje :D

Díky moc!

 
Nahoru Odpovědět 11.3.2015 21:19
Avatar
j.c
Člen
Avatar
Odpovídá na j.c
j.c:

prosím ještě o pomoc, vytvořil jsem a přidal fo JFormu třídu

import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

public class IntTab1 extends JTable {
class MyTableModel extends DefaultTableModel {

    public MyTableModel(Object rowData[][], Object columnNames[]) {
         super(rowData, columnNames);
      }

    @Override
      public Class getColumnClass(int col) {
        if (col == 1)       //second column accepts only Integer values
            return Integer.class;
        else return Integer.class;  //other columns accept String values
    }

    @Override
      public boolean isCellEditable(int row, int col) {
        if (col == 0)       //first column will be uneditable
            return false;
        else return true;
      }
    }

public IntTab1 (TableModel MyTableModel) {

    }
}

ALE:
v generované sekci Init Components se objeví chyba, viz. obrázek.
Tu třídu přepisuju od rána a ne a ne na to přijít.

Udělal jsem si na MousePressed vypsání getColumnName(0)­.getClass().. a byl to stále string. A teď je špatně konstruktor.

 
Nahoru Odpovědět 12.3.2015 15:52
Avatar
j.c
Člen
Avatar
Odpovídá na j.c
j.c:

je to špatně, ano, ale nevím, jak svůj TableModel té tabulce vnutit.
Ale toto

public class IntTab1 extends JTable {
// nechodí!!
     DefaultTableModel MyTableModel;

     class MyTableModel extends DefaultTableModel {

    public MyTableModel(Object rowData[][], Object columnNames[]) {
         super(rowData, columnNames);

    }
......

nechodí také...

 
Nahoru Odpovědět 12.3.2015 17:19
Avatar
Atrament
Člen
Avatar
Odpovídá na j.c
Atrament:

To proto že vytváříš ten MyTableModel jako vnitřní třídu v IntTab. Vytáhni MyTableModel ven jako samostatnou třídu.

 
Nahoru Odpovědět 12.3.2015 17:44
Avatar
j.c
Člen
Avatar
Odpovídá na Atrament
j.c:

Díky. Jen, prosím, jak ten MyTableModel dostanu k té příslušné tabulce?
Tabulku table_tipy refreshuji takto

private void Refresh_table_tipy() {
    String sql = "Select * from Tipy";
    try {
        pst = conn.prepareStatement(sql);
        rs = pst.executeQuery();
        table_tipy.setModel(DbUtils.resultSetToTableModel(rs));
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, e);
    }
}

A tu tabulku jsem přetáhl z palety a pojmenoval table_tipy.

 
Nahoru Odpovědět 12.3.2015 18:09
Avatar
j.c
Člen
Avatar
Odpovídá na j.c
j.c:

Objevil jsem Code Customizer a MyTableModel jsem se tam pokusil vnutit. Viz. obr1. Udělal jsem si event, která vypisuje getColumnClass a getModel

private void table_tipyMousePressed(java.awt.event.MouseEvent evt) {
     String    qq = table_tipy.getColumnClass(1).toString();
     qq=qq+" "+table_tipy.getModel();
     JOptionPane.showMessageDialog(null, qq);

a zase nic, viz. obr 2. :(

Editováno 12.3.2015 19:04
 
Nahoru Odpovědět 12.3.2015 19:01
Avatar
j.c
Člen
Avatar
Odpovídá na j.c
j.c:

sorry, ty obrázky tu zlobí

 
Nahoru Odpovědět 12.3.2015 19:05
Avatar
j.c
Člen
Avatar
Odpovídá na j.c
j.c:

Chodí to. Děkuji za snahu pomoci. Bohužel jsem si stále přepisoval MyTableModel v metodě Refresh_table_ti­py() viz.tady výše a tak mi snaha pomoci nebyla nic platná.

Když jsem na to přišel, nevěděl jsem, jak bych se vypořádal s DbUtils.resul­tSetToTableMo­del(rs)) knihovnou (import net.proteanit­.sql.DbUtils), která dělá zásadně DefaultTableModel, jak bych ji donutil aby přebírala můj model.

Naštěstí jsem našel na netu podobný zdroják (http://stackoverflow.com/…-with-search). Ten jsem použil a přepsal tam na konci výstup do TableDefaultModel na ten svůj a je to. Toho kódu je jen kousek.

Ještě jednou děkuji a omlouvám se za svou grafo a jinou mánii :)

 
Nahoru Odpovědět 12.3.2015 21:11
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 16 zpráv z 16.