Avatar
veselyjan22
Člen
Avatar
veselyjan22:

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
Tomek
Člen
Avatar
Odpovídá na veselyjan22
Tomek:

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
"Jak nahoře, tak dole. Jak uvnitř, tak vně."
Avatar
veselyjan22
Člen
Avatar
Odpovídá na Tomek
veselyjan22:

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
Tomek
Člen
Avatar
Tomek:

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
"Jak nahoře, tak dole. Jak uvnitř, tak vně."
Avatar
veselyjan22
Člen
Avatar
Odpovídá na Tomek
veselyjan22:

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:

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
Tomek
Člen
Avatar
Tomek:

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
"Jak nahoře, tak dole. Jak uvnitř, tak vně."
Avatar
veselyjan22
Člen
Avatar
veselyjan22:

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
Tomek
Člen
Avatar
Tomek:

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
"Jak nahoře, tak dole. Jak uvnitř, tak vně."
Avatar
veselyjan22
Člen
Avatar
Odpovídá na Tomek
veselyjan22:

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
Tomek
Člen
Avatar
Tomek:

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
"Jak nahoře, tak dole. Jak uvnitř, tak vně."
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.