Moro
Yritän saada vectorin lisättyä fileChooserilla haetun tiedostonnimeä, mutta saan pelkästään virheilmoituksia.
package kuvagalleria; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.util.Vector; import javax.swing.*; public class MainApp extends JFrame implements ActionListener { JLabel rightLabel, centerLabel, leftLabel; JList valikko1, valikko2; String kuva; Vector<String> kuvat; JList ku; JPanel valikot; JTextArea area; public static void main(String[] args){ MainApp appWindow = new MainApp(); appWindow.setTitle("Hello"); appWindow.setSize(600,1000); appWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); appWindow.setVisible(true); } public MainApp() { rightLabel = new JLabel ("oikea"); centerLabel = new JLabel ("keski"); leftLabel = new JLabel ("vasen"); centerLabel.setHorizontalAlignment(SwingConstants.CENTER); rightLabel.setHorizontalAlignment(SwingConstants.CENTER); //Main BorderLayout JPanel placeholder = new JPanel(); BorderLayout mainbl = new BorderLayout(); placeholder.setLayout(mainbl); //EAST BORDER and buttons JButton button1 = new JButton("Lisää uusi kuva"); button1.addActionListener(this); JButton button2 = new JButton("Lisää uusi kuvakansio"); JButton button3 = new JButton("Poista kuva"); JPanel buttons = new JPanel(); buttons.setLayout(new BoxLayout(buttons, BoxLayout.PAGE_AXIS)); buttons.add(button1); buttons.add(button2); buttons.add(button3); buttons.add(centerLabel); this.getContentPane().add(buttons, BorderLayout.CENTER); //Add left layout to choose picture JPanel valikot = new JPanel(); valikot.setLayout(new BoxLayout(valikot, BoxLayout.PAGE_AXIS)); //valikot.setPreferredSize(new Dimension(100, 550)); Vector<String> kuvat = new Vector<String>(); ku = new JList(kuvat); JScrollPane sp3 = new JScrollPane(ku); valikot.add(sp3); Vector<String> kansiot = new Vector<String>(1); JList ka; ka = new JList(kansiot); JScrollPane sp4 = new JScrollPane(ka); valikot.add(sp4); kansiot.add("asd"); this.getContentPane().add(valikot, BorderLayout.CENTER); // Add layouts to main BorderLayout placeholder.add(buttons, BorderLayout.WEST); this.getContentPane().add(placeholder, BorderLayout.EAST); this.getContentPane().add(valikot, BorderLayout.WEST); } public void actionPerformed(ActionEvent arg0) { JFileChooser valkuv = new JFileChooser(); valkuv.showOpenDialog(null); File f = valkuv.getSelectedFile(); //String filepath = f.getAbsolutePath(); //String filename = f.getName(); System.out.println(f.getName()); kuvat.add(f.getName()); } }
Miten tuo lisäys onnistuu?
Virheilmoituksia tulee:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at kuvagalleria.MainApp.actionPerformed(MainApp.java:147)
Mod. huom: järkeä virheilmoituksen pituuteen!
Luot konstruktorissa uuden muuttujan 'kuvat' sen sijaan että alustaisit luokan jäsenmuuttujan.
Vector<String> kuvat = new Vector<String>();
pitäisi olla
kuvat = new Vector<String>();
Kiitos. Tämän avulla pääsin eroon virheilmoituksista, mutta ei se vieläkään lisää nimeä sinne. Nyt ei anna mitään virheilmoitusta. Listassa alunperin oleva "asd" häviää myös, kun yritän lisätä tiedoston nimen.
JListin konstruktorin dokumentaation mukaan tuota vektoria ei tosiaan saisi muuttaa JListin luomisen jälkeen.
En tunne Swingin listoja hirveän hyvin, mutta ymmärtäisin, että oikea ratkaisu on luoda ListModel ja antaa se JListin konstruktorille jotenkin tyyliin:
DefaultListModel<String> listModel = new DefaultListModel<String>(); ku = new JList<String>(listModel);
Tämän jälkeen listaan voi lisätä elementtejä listModelin addElement-funktiolla.
Valtavat kiitokset Sisuaskille, jos nyt saisin tämän homman tehtyä ja pääsisin joulun viettoon. Hyvää joulua!
Aihe on jo aika vanha, joten et voi enää vastata siihen.