JTable i image

0

Mam problem z wrzuceniem obrazka do danej komórki w JTable. Można to jakoś zrobić przez

tabela.setValueAt(new ImageIcon("ścieżkaObrazu") , row, col)

Wybranie kolumny i wiersza, czyli danej komórki już mam. Kiedy tak robię, zamiast obrazka wyświetla mi się nazwa obrazka, dajmy na to "muzyka.jpg" i tyle. Jak to zrobić?

1

Napisz własny renderer

0

a mógłby ktoś pomóc w napisaniu takiego renederu? Znalazłem coś takiego: http://www.java2s.com/Code/Java/Swing-JFC/RenderinganimageinaJTablecolumn.htm jednak to wrzuca obraz do całej kolumny, jak "ulepszyć" ten kod, do zmiany obrazka w jednej komórce zamiast w całej kolumnie?

0

nie wiem co robię źle. Teraz zamiast obrazu wyświetla mi
1$ImageRenderer[Table.cellRenderer,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=javax.swing.border.EmptyBorder@79c77a19,flags=25165832,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,horizontalAlignment=LEADING,horizontalTextPosition=TRAILING,iconTextGap=4,labelFor=,text=,verticalAlignment=CENTER,verticalTextPosition=CENTER]

0
    JButton nowaTura = new JButton("Tura");
    ImageIcon img1= new ImageIcon("1.jpg");
    JTable pole = new JTable(10, 10);
    Random r = new Random();
   
    public int ile;
    public int rx;
    public int ry;
hello() {
        setSize(250, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final JPanel panel = new JPanel();
        panel.setLayout(new FlowLayout());
        panel.add(new JLabel("lll"));
        panel.add(pole);
        panel.add(nowaTura);
        nowaTura.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                ry = pole.getSelectedColumn();
                rx = pole.getSelectedRow();
                ImageRenderer img12= new ImageRenderer("1.jpg") ;
                pole.getModel().setValueAt(img12,rx,ry);
                SwingUtilities.updateComponentTreeUI(panel);
               
            }
        });
       
        Container cPanel = getContentPane();
        cPanel.add(panel);
        setVisible(true);

    }
        class ImageRenderer extends DefaultTableCellRenderer {
        ImageIcon icon = null;

        ImageRenderer(String iconName) {
            icon = new ImageIcon(getClass().getResource(iconName));
        }
    };
0

Zawsze musisz ustawić renderera np. na kolumnę:

table.getColumnModel().getColumn(1).setCellRenderer(new ImageRenderer("1.png"));

Musisz nadpisać poniższą metodę w rendererze (w zależności co chcesz trzymać w jtable):

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
            boolean hasFocus, int row, int column) {
            return new JLabel(icon);
    }

Jeżeli chcesz dynamicznie zmieniać ikony to musisz zmienić renderera, ciało metody getTableCellRendererComponent będzie wyglądało tak:

 
return new JLabel((ImageIcon)value);

i teraz zadziała metoda setValueAt.

0
  
...
              pole.getColumnModel().getColumn(0).setCellRenderer(new ImageRenderer("1.jpg"));
             nowaTura.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                ry = pole.getSelectedColumn();
                rx = pole.getSelectedRow();

                pole.getModel().setValueAt(new ImageRenderer("1.jpg"),rx,ry);
                SwingUtilities.updateComponentTreeUI(panel);
             
            }
        });
...
class ImageRenderer extends DefaultTableCellRenderer {
        ImageIcon icon = null;

        ImageRenderer(String iconName) {
            icon = new ImageIcon(getClass().getResource(iconName));
        }
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
                                                       boolean hasFocus, int row, int column) {
            return new JLabel((ImageIcon)value);
        }
    }

coś takiego? Teraz, pierwsza kolumna jest tak jakby biała - nie da rady zaznaczyć żadnej komórki. Dodatkowo dalej nie wyświetla obrazu :x

0

a gdzie trzymasz ikonki? Jeżeli w katalogu src to spróbuj ścieżkę: "src/1.jpg"
Ponadto, ustawienia renderera:

table.getColumnModel().getColumn(0).setCellRenderer(new ImageRenderer());

Ustawienie wartości:

table.setValueAt(new ImageIcon("src/1.jpg"), rx, ry);
0

po dodaniu src/1.jpg nie mogę uruchomić nawet. Błąd:
Exception in thread "main" java.lang.NullPointerException
at javax.swing.ImageIcon.<init>(ImageIcon.java:217)
at Leaf$ImageRenderer.<init>
Od czego to może zależeć? Mój image jest za brzydki? :C

0
table.getColumnModel().getColumn(0).setCellRenderer(new ImageRenderer(**jak nic tu nie podam to się drze że mam błąd**));

Podając w tamtym miejscu tak jak było wcześniej "1.jpg"
a później to

table.setValueAt(new ImageIcon("src/1.jpg"), rx, ry);

Dzieje się to samo. Pierwsza kolumna jest zupełnie nie do ruszenia, tak jakby wypełniona obrazkami ale niewidocznymi. Kiedy chce dodać obrazek w innej komórce to znowu ten sam efekt co wcześniej - wypisuje w komórce "src/1.jpg"

1

Już nie jest Ci potrzebne przekazanie ścieżki do renderera, więc powinien wyglądać tak:

class ImageRenderer extends DefaultTableCellRenderer {
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
            boolean hasFocus, int row, int column) {
            return new JLabel((ImageIcon) value);
    }
}

Jak to nie pomoże to pokaż całość:) jeżeli nic nie pokazuje to masz złą ścieżkę najprawdopodobniej. Gdzie trzymasz ikony?

0

To nic nie zmienia, dzieje się to samo

0
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTable;

public class hhh extends JFrame {

    JButton addAnimal = new JButton("Dodaj ślimaka");
    JTable pole = new JTable(10, 10);
    public int ile;
    public int rx;
    public int ry;

    hhh() {
        setSize(250, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final JPanel panel = new JPanel();
        panel.setLayout(new FlowLayout());
        panel.add(new JLabel("lll"));
        panel.add(pole);
        panel.add(addAnimal);
        pole.getColumnModel().getColumn(0).setCellRenderer(new ImageRenderer());
        addAnimal.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                ry = pole.getSelectedColumn();
                rx = pole.getSelectedRow();

                pole.setValueAt(new ImageIcon("1.jpg"), rx, ry);

            }
        });

        Container cPanel = getContentPane();
        cPanel.add(panel);
        setVisible(true);
    }

    public static void main(String[] args) {
        new hhh();
    }
    class ImageRenderer extends DefaultTableCellRenderer {
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
                                                       boolean hasFocus, int row, int column) {
            return new JLabel((ImageIcon) value);
        }
    }
}
1

W rendererze sprawdź jeszcze czy value jest nullem(bo Twój model jest pusty), jeżeli tak to daj mu jakąś defaultową ikonkę (najlepiej przekazaną przez konstruktor) w ten deseń:

class ImageRenderer extends DefaultTableCellRenderer {
    
    private ImageIcon defaultIcon;
    
    private ImageRenderer(ImageIcon defaultIcon){
        this.defaultIcon= defaultIcon;
    }

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
            boolean hasFocus, int row, int column) {
        if (value == null) {
            return new JLabel(defaultIcon);
        } else {
            return new JLabel((ImageIcon) value);
        }
    }

}
0

Teraz jest genialnie i cudownie. Wielkie dzięki :D

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.