JTable - scroll

0

Wtam,

mam problem ze scrollem w JTable. Generalnie mam prosty kod:

private JTable tabela = new JTable(new ModelTabeli());
private JScrollPane scrollTabeli = new JScrollPane(tabela);

ModelTabeli to klasa dziedziczaca po AbstractTableModel. Wszystko działa, wyświetla się ale gdy tabela nie mieści mi się na ekranie nie pokazuje się scroll...

0

ustaw tabeli setPreferredScrollableViewportSize a powinno się poprawić :)

0

Nie pomogło. Podałem Dimension jako parametr i nadal nie ma.

0

no to spróbuj :

 
tabela.setAutoResizeMode (JTable.AUTO_RESIZE_OFF);
0

Też nie... Kurde nie wiem co z tym zrobić.

0

pokaż więcej kodu a może się rozjaśni :)

0

Mam jeszcze wywołaną metodę:

tabela.setFillsViewportHeight(true);

Ale bez tego nie wypełnia mi się tabela danymi.

0

Kiedy tabela jest pierwszy raz wyświetlana, to model ma już dużo danych, czy też dane są dopisywane po wyświetleniu tabeli?

0

Tabel za pierwszym razem jest pusta. Dane są dodawane buttonami, ale bez funkcji wymienionej wyżej, ich nie widać.

0

Po dodaniu danych wywołaj

model.fireTableChanged();
0

Nie mam stworzonego obiektu modelu tabeli więc nie wiem na czym go wywołać. poza tym nie wiem, czy to to samo ale po dodaniu wywołuje metodę "repaint();".

0
package jrar;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;

public class JRar extends JFrame{
    
    private JPanel glownyPanel = new JPanel();
    private JPanel dolnyPanel = new JPanel();
    private JTable tabela = new JTable(new ModelTabeli());
    private JScrollPane scrollTabeli = new JScrollPane(tabela);
    private JButton dodaj = new JButton("Dodaj plik");
    private JButton usun = new JButton("Usuń plik");
    private JButton wyczysc = new JButton("Wyczyść");
    private JFileChooser wyborPlikow = new JFileChooser();
    
    JRar(){
        
        this.setLayout(new BorderLayout());
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setSize(640, 480);
        this.setTitle("JRar");
        this.setResizable(false);
        initComponent();
    }
    
    private void initComponent(){
        
        dodaj.addActionListener(new DodajPlik());
        wyczysc.addActionListener(new Wyczysc());
        usun.addActionListener(new Usun());
        
        tabela.setFillsViewportHeight(true);
        
        // Ustawienie szerokości kolumn
//        TableColumn kolumny;
//        kolumny = tabela.getColumnModel().getColumn(0);
//        kolumny.setMinWidth(480);
        
        // Ustawienie wysokości wiersza
        tabela.setRowHeight(20);
        
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(scrollTabeli, javax.swing.GroupLayout.DEFAULT_SIZE, 620, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(dodaj)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(usun)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(wyczysc)
                        .addGap(0, 0, Short.MAX_VALUE)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(scrollTabeli, javax.swing.GroupLayout.PREFERRED_SIZE, 326, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(dodaj)
                    .addComponent(usun)
                    .addComponent(wyczysc))
                .addContainerGap(81, Short.MAX_VALUE))
        );

        pack();
    }
    
    public static void main(String[] args){
        
        new JRar().setVisible(true);
    }
    
    private class DodajPlik implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            
            wyborPlikow.setMultiSelectionEnabled(true);
            int wybor = wyborPlikow.showOpenDialog(rootPane);
            
            if(wybor == 0)
                ModelTabeli.dodajDoListy(wyborPlikow.getSelectedFiles());
            
            
            
            repaint();
        }
        
    }
    
    private class Wyczysc implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            
            ArrayList<File> lista = ModelTabeli.getLista();
            lista.clear();
            ModelTabeli.setLista(lista);
            
            repaint();
        }
        
    }
    
        private class Usun implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            
            int zaznaczone = tabela.getSelectedRow();
            
            ArrayList<File> lista = ModelTabeli.getLista();
            
            lista.remove(zaznaczone);
            
            ModelTabeli.setLista(lista);
            
            tabela.clearSelection();
            
            repaint();
        }
        
    }
}

class ModelTabeli extends AbstractTableModel{
    
    private String[] columns = {"Nazwa", "Rozmiar"}; 
    private static ArrayList<File> lista = new ArrayList<>();
    
    @Override
    public int getRowCount() {
        return lista.size();
    }

    @Override
    public int getColumnCount() {
        return columns.length;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        
        File plik = (File) lista.get(rowIndex);
        
        if(columnIndex == 0){
            
            return plik.getAbsolutePath();
        }
        
        else{
            
            String rozmiar = ((plik.length()/1024) + " KB");
            return rozmiar;
        }
    }
    
    @Override
    public String getColumnName(int col) {
        return columns[col];
    }
    
    public static void dodajDoListy(File[] pliki){

        for(int i =0; i<pliki.length; i++)
            lista.add(pliki[i]);
        
    }
    
    public static ArrayList<File> getLista(){
        
        return lista;
    }
    
    public static void setLista(ArrayList<File> listaPrzyslana){
        
        lista = listaPrzyslana;
    }
}
0

Polikwiduj metody static w klasie ModelTabeli i utwórz obiekt model typu ModelTabeli.

0

Polikwidowałem i nadal nic...

0

A to

model.fireTableChanged();

dopisałeś? Teraz już możesz bo istnieje odpowiedni obiekt.

0

Co podać jako parametr tej metody ? Gdy podaje null, to nadal nic.

0

Pisałem z pamięci, dodaj

model.fireTableDataChanged();
0

Teraz jest ok. Wielkie dzięki !

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