Pobieranie danych z pliku

0

Witam

Probuje odczytac plik do JTable i problem mam taki ze JTable ma podana jedna stala Jtable[5][x] oraz zmienna x(ustawiony na 0) przez ktora program nie odpala mi tabeli, drugi problem jest taki ze wczytuje dane z pliku ktory wstepnie przygotowalem i program nie chce tego mi wrzucic do tabeli, nie wiem gdzie popelniam blad choc ogolnie tez dopiero zaczynam zabawe z swingiem wiec za duzo nie wiem

import javax.swing.*;
import java.awt.event.ActionEvent;
import javax.swing.JMenuBar;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableModel;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class GUI extends DefaultTableModel {


    JMenuItem Wczytaj, Zapisz;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }


    public static void createAndShowGUI() {
        JMenu menuOption, menuSorting;

        String[][] dane = new String[5][5];

        JPanel panel = new JPanel();

        JFrame main = new JFrame();
        main.setTitle("music player");
        main.setBounds(450, 100, 1024, 768);
        main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        main.setResizable(true);
        main.setVisible(true);


        JMenuBar menuBar = new JMenuBar();

        menuOption = new JMenu("Menu");
        JMenuItem Wczytaj = new JMenuItem("Wczytaj");


        JMenuItem Zapisz = new JMenuItem("Zapisz");
        //Zapisz.addActionListener(this);
        /*
        Zapisz.addActionListener(e -> {
            JFileChooser zapisz = new JFileChooser();
            if (zapisz.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {

                File plik = zapisz.getSelectedFile(); }
        });

         */
        menuOption.add(Wczytaj);
        menuOption.addSeparator();
        menuOption.add(Zapisz);


        menuSorting = new JMenu("Sorting");
        JRadioButtonMenuItem alfabetycznie = new JRadioButtonMenuItem("Alfabetycznie");
        JRadioButtonMenuItem rokwydania = new JRadioButtonMenuItem("Dacie wydania");
        JRadioButtonMenuItem dlugosc = new JRadioButtonMenuItem("Dlugości");
        menuSorting.add(alfabetycznie);
        menuSorting.addSeparator();
        menuSorting.add(rokwydania);
        menuSorting.addSeparator();
        menuSorting.add(dlugosc);

        JPopupMenu Editable = new JPopupMenu();
        JMenuItem editable = new JMenuItem("Edytuj");
        Editable.add(editable);


        main.setJMenuBar(menuBar);
        menuBar.add(menuOption);
        menuBar.add(menuSorting);

        MyTableModel Table = new MyTableModel();
        Wczytaj.addActionListener(e -> Table.Wczytaj());
        Table.Show(main);



    }

}

classa Lista

import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;


class MyTableModel {

    int q = 0;
    
    void Create(int x){
        String[] Column = {"Tytuł", "Czas trwania", "Twórca", "Data premiery", "gatunek"};
        Object[][] data = new Object[x][5];
        JTable jt = new JTable(data, Column);
        JScrollPane sp = new JScrollPane(jt);
    }
    

    void Show(JFrame x){
        String[] Column = {"Tytuł", "Czas trwania", "Twórca", "Data premiery", "gatunek"};
        Object[][] data = new Object[q][5];
        JTable  jt = new JTable(data, Column);
        JScrollPane sp = new JScrollPane(jt);
        sp.setVisible(true);
        x.add(sp);
    }
    

    void Wpisz(){

    }

    void Wczytaj(){
        {JFileChooser wczytaj = new JFileChooser();
            if (wczytaj.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
                File plik = wczytaj.getSelectedFile();
                try {
                    Scanner skaner = new Scanner(plik);
                        int i = 0;
                        while (skaner.hasNextInt()) {
                            i++;
                        }
                        q = i;
                        i = 0;
                        while (skaner.hasNextLine()){
                           String s = skaner.nextLine();
                           String holder [] = s.split("-");
                           holder[4] = holder[3].replace(",",".");
                           String nazwa = holder[0];
                           String CzasTrwania = holder[1];
                           String wykonawca = holder[2];
                           String Premiera = holder[3];
                           String Rodzaj = holder[4];
                           for(int b = 0; b > 4; b++) {
                               jt.setValueAt(holder[b], b, i);
                           }
                        }
                        skaner.close();

                }
                catch (FileNotFoundException ex) {
                    ex.printStackTrace();
                }
            }};

    }

}

1

Jestem niepomiernie zdziwiony Twoją klasą 'Model'
Skąd pochodzi pomysł, aby zignorować wszystko, co Swing ma przygotowane w tym względzie?

https://docs.oracle.com/javase/7/docs/api/javax/swing/table/TableModel.html (kwerenda google swing table model, liczne przykłady)

GDYBY hipotetycznie nawet implementowała stosowne interface, albo wychodziła z którejś przygotowanej klasy, to flaki ma brzydkie:

  • dlaczego tablica 5ciu Objectów, a nie jakaś klasa implementująca wiersz,z prawidłowymi typami pól?
  • dlaczego stałe
  • wszytko pomieszane. W klasie służebnej tworzenie nadrzędnego obiektu, GUI na spółkę z danymi i I/O
  • pomieszanie i nazwy klas (nieliczne czyli słownie jedna) są błędne, żle nazywają to, co niby mają robić. A słowa są ważne, za dobrze dobranymi słowami idzie dobre myślenie
0

Jesli chodzi o nazwy klas w classie Lista sa zwiazane z tym ze niedawno zasadniczo ja stworzylem i nie zastanawialem sie jeszcze nad tym a na poczatek chce zajac sie wiekszymi problemami bo potem nie problem to zmienic.
Jesli chodzi o wielkosc tablicy to tylko tyle kolumn ma byc czyli dokladnie 5 dlatego jest stworzone na stale 5. Jedyne co ma zmieniac ilosc to ilosc wierszy dlatego tam jest wstawiony x.
Jesli chodzi o wrzucenie tabeli do classy Lista i jednoczesnie wrzucenie tam zapisu, odczytu i calej reszty to poniewaz uznalem ze latwiej bedzie przechowywac cala tablice z wartosciami i dotyczacymi jej funkcjami w osobnej klasie.
Oczywiscie chce przypomniec ze jestem poczatkujacy i nadal mam wiele do nauczenia, ale jesli mogl bys pokazac w jaki sposob powinno to wygladac to byl bym bardzo wdzieczny.

PS na ten moment program odpala sie wyswietlajac mi JTable[x][5]; gdzie x jest ustalone na 0 tylko przy odczycie nie wyswietla mi ponownie tablicy zapelnionej danymi. Wiem ze wywala mi sie w petli for tylko nie wiem dlaczego

1

Tu masz łopatologicznie, o co chodzi z klasami modelowymi. Bardzo dobry kawał wiedzy, godny polecenia (z drobnymi szczegółami bym zrobił inaczej)
https://docs.oracle.com/javase/tutorial/uiswing/components/table.html

Tu masz stosunkowo mało zły artykuł z AbstractTableModel
https://www.dreamincode.net/forums/topic/231112-from-basic-jtable-to-a-jtable-with-a-tablemodel/

Szukam "popularyzatorskiego" przykładu jak użyć Modelu z klasą danych (beanem), zamiast tablicy Objectów,
Jak znajdę to zamieszczę.
Mam swój własny kod w tym względzie, ale rozbudowany w szczegóły Ciebie nie interesujące (wręcz szkodliwe na początek, jak JPA), może go skrócę, ale już jut ... dzisiaj ale za dnia.

UPDATE Znasz / wiesz trochę o refleksji? Nie przestraszy Cię to? Bo ten ma to jako rdzeń.

UPDATE2:
Tu masz Model z wierszami Employee, czyli idzie w stronę, którą ja popieram.
https://www.codejava.net/java-se/swing/editable-jtable-example

Więc ten mój skomplikowany nieco kod z refleksją nie będzie potrzebny

0

Przestraszyc by nie przestraszyl, choc dlugo moglo by zajac jego zrozumienie. Poki co sprobuje przeanalizowac podeslane linki i zobaczyc co i jak. Ale to tez za chwilke bo siedze przy tym co wypocilem i znalazlem blad przy petli while przez co nie zwiekszala mi sie liczba wierszy w tabeli, problem tylko taki ze jesli zmienie na hasNextLine to wychodzi petla nieskonczona a nie taka ile jest zapisanych wierszy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1