Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Tabulka a buňky

Aktivity
Avatar
veselyjan22
Člen
Avatar
veselyjan22:26.11.2014 11:27

Zdravim,

chci se zeptat, jak se dá řešit problém s tabulkou ve swingu.
Mám vytvořený defaultTableModel, JTable na JScrollPane. Vyplněná tabulka se mi pak kopíruje do dvourozměrného pole double. Když tabulku vyplním, a nechám "aktivní" poslední buňku tabulky, tak při kopírování do pole [][] double, se mi ten poslední prvek vloží jako "null". Pokud ale odkliknu na jinou libovolnou buňku v tabulce, vše se překopíruje úplně normálně. Nevíte jak, například kliknutím na tlačítko (nebo i jiná akce, to není podstatné - používám actionlistener), přepnout na jinou "aktivní" buňku? Nic pořádného jsem nenašel.

Když pak nastavuji hodnoty tabulky zpět z pole, poslední prvek to nebere vůbec v potaz a zůstává tam pořád stejná hodnota.

Doufám, že mě někdo pochopí. :)

Díky za odpovědi.

 
Odpovědět
26.11.2014 11:27
Avatar

Člen
Avatar
Odpovídá na veselyjan22
:26.11.2014 12:51

Nedokážu si to plně představit. Kdybys přiložil zdrojový kód, tak by to možná pochopilo ještě více lidí ;)

 
Nahoru Odpovědět
26.11.2014 12:51
Avatar
veselyjan22
Člen
Avatar
Odpovídá na
veselyjan22:26.11.2014 15:19

No zkusim to sem dát.

Tohle je Event na tlačítko pro kontrolu matice, kde se mi nahrajou data z tabulky (přes kontroly) do matice typu Matice. mat Matice je složená z vektorů typu Vektor, kterej je složenej z ArrayListu (kvůli libovolnosti počtu prvků). Nechci to psát moc složitě ale jinak to asi nejde.

public class Event implements ActionListener { //kontrola matice

        @Override
        public void actionPerformed(ActionEvent e) {
                table.clearSelection(); //odaktivnění všech buněk - nefunguje tak jak potřebuju
            //pocetni operace
            pV = new Vektor[pocetVektoru];
            double[] pole = new double[pocetPrvku];
            for (int i = 0; i < pocetVektoru; i++) {
                pV[i] = new Vektor();
            }

            pole[0] = 0;

            boolean f = true;
            for (int i = 0; i < pocetVektoru; i++) {
                for (int j = 0; j < pole.length; j++) {
                    try {
                        pole[j] = Double.parseDouble((String) m.getValueAt(j, i));
                    } catch (NumberFormatException d) {
                        f = false;
                        buton.setBackground(Color.red);
                    } catch (NullPointerException s) {
                        if (m.getValueAt(j, i) == null) {
                            pole[j] = 0;
                            m.setValueAt(0, j, i);
                        }
                    }

                }

                Vektor a = new Vektor();
                a.setVektor(pole);
                pV[i] = a;
            }

            if (f) {
                elHbut.setEnabled(true);
                elDbut.setEnabled(true);
                detBut.setEnabled(true);
                butZav.setEnabled(true);
            } else {
                buton.setEnabled(f);
                view.setVisible(true);
                view.setForeground(Color.red);
                view.setText("Chybné zadání!");
            }
            f = true;

            mat = new Matice(pV);
        }

m je DefaultTableModel

private JTable table() {

        m.setColumnCount(pocetVektoru);
        m.setRowCount(pocetPrvku);

        table = new JTable(m);
        //  grid.gridx = 0;
        //   grid.gridy = 0;
        //   con.add(table, grid);
        JScrollPane sp = new JScrollPane(table,
                JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

        return table;
    }

tohle je metoda pro vytvoření tabulky JTable na DefaultTableModel

problém je, že když nechám zakliknutej poslední prvek v tabulce, do matice (mat Matice) se mi uloží jako null - v tabulce se pak zobrazuje jen prvek, kterej jsem tam vyplnil

lze nějak nastavit, aktivní jinej prvek tabulky, třeba hned v tom Event?

Je to pochopitelnější? :)

 
Nahoru Odpovědět
26.11.2014 15:19
Avatar

Člen
Avatar
:26.11.2014 17:15

No doufal jsem v celý zdrojový kód, abych si to mohl vyzkoušet :o)). Ale to nevadí. Z toho tvého popisu mě napadlo, že bys mohl označit jako aktivní nějaký jiný prvek než tabulku, třeba přímo JFrame nebo JDialog, ve kterém je ta tabulka umístěná. Slouží k tomu metoda requestFocus() (napr. frame.requestFo­cus() ). A tu bys zavolal jako prvni v obsluze udalosti.

 
Nahoru Odpovědět
26.11.2014 17:15
Avatar
veselyjan22
Člen
Avatar
Odpovídá na
veselyjan22:26.11.2014 18:56

hale to zní docela zajímavě :)
každopádně vyzkoušim, díky za tip, napíšu jestli to tak funguje, kdyby s tim měl problém i někdo jiný :D

 
Nahoru Odpovědět
26.11.2014 18:56
Avatar
veselyjan22
Člen
Avatar
veselyjan22:29.11.2014 20:24

Tak bohužel requestFocus nezabral, stále to poslední prvek tabulky převádí jako null ... :`, zkoušel jsem i table.clearSe­lection, ale taky bohužel nezabralo.

Když jsem to zkusil bez try, catch(kdybych ho náhodou napsal špatně), stejná chyba. Zkrátka, jakmile nechám aktivní poslední buňku, přečte se jako null.

 
Nahoru Odpovědět
29.11.2014 20:24
Avatar

Člen
Avatar
:29.11.2014 21:52

A mohl bys, prosím, poskytnout kompletní zdrojový kód, aby si to ti, včetně mě, co chtějí pomoci, mohli vyzkoušet?

 
Nahoru Odpovědět
29.11.2014 21:52
Avatar
veselyjan22
Člen
Avatar
veselyjan22:30.11.2014 11:58

Jo, promiň. Budou stačit všechny zdrojáky jen jako .java soubory?

http://uloz.to/…T/matice-rar

 
Nahoru Odpovědět
30.11.2014 11:58
Avatar

Člen
Avatar
:30.11.2014 16:04

Jo, je to v pohodě. Já si to nějak sestavím. V týdnu se na to podívám a pak dám vědět s nějakým případným řešením. Ale ještě me teď napadlo, jak jsi psal, že když před potvrzením klikneš na jinou buňku, tak se ti ta matice sestáví správně, tak by tu byla možnost ještě v podobě použití Robota. Tahle třída za tebe vlastně udělá to samé, co bys dělal jako uživatel (tzn. odkliknutí na jinou buňku). Metodou mouseMove(int x, int y) řekneš robotovi kam má najet myší a metodami mousePressed(int a) a mouseReleased(int b) řekneš robotovi aby klikl a odklikl. Jako parametr zadavas konstantu tlacitka, kterým klikas (BUTTON_MASK1 - L tlačítko, BUTTON_MASK2 - P tlačítko).
viz. https://docs.oracle.com/…t/Robot.html
Ale je to takové řešení přes ruku ... :-)

Editováno 30.11.2014 16:06
 
Nahoru Odpovědět
30.11.2014 16:04
Avatar
veselyjan22
Člen
Avatar
Odpovídá na
veselyjan22:30.11.2014 16:08

Děkuju moc, určitě to bude nějaká pitomost.

Hehe, s tim robotem je to zajímavý, pročtu si to a pokusim se to použít, i když to asi nebude úplně čistý řešení no. :)

Každopádně díky moc za tvůj čas, že na to mrkneš.

 
Nahoru Odpovědět
30.11.2014 16:08
Avatar

Člen
Avatar
:3.12.2014 21:26

Tak jsem to zkusil, a co se týče tvého problému, tak jsem žádný nenašel. Funguje mi to úplně normálně. Poslední hodnota se zapíše, i když je buňka aktivní. Jinak ve třídě MatrixGui v metodě table() dáváš JTable do JScrollPane, ale ta tvá metoda vraci jenom tabulku, takže se ti na hlavní panel JScrollPane nepřidá. A ještě poznámka k GridBagConstrants

buton = new JButton("Kontrola matice");
        grid.gridx = 0;
        grid.gridy = 2;
        con.add(buton, grid);

        elHbut = new JButton("GEM - horní");
        elHbut.setEnabled(false);
        grid.gridx = 0; // TOHLE TU BÝT NEMUSÍ (UŽ JE TO NASTAVENO OD PŘEDCHOZÍHO KROKU)
        grid.gridy = 3;
 
Nahoru Odpovědět
3.12.2014 21:26
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 11 zpráv z 11.