[Java] Swing components verschijnen niet

Status
Niet open voor verdere reacties.

niekfct

Terugkerende gebruiker
Lid geworden
19 jul 2006
Berichten
1.563
Dag Helpers,

Ik heb een probleem in mijn programma. Ik wil een variabel aantal TrackPanels (extends JPanel) laten zien in een JScrollpanel. Wanneer ik JCheckBoxes aanklik in die TrackPanels, en vervolgens op een knop druk, moeten de aangevinkte TrackPanels verdwijnen.

Wat ik doe:

Code:
public void refresh()
    {
        trackPanel.removeAll();                                     //JPanel trackPanel zit in een JScrollPane.
        trackPanels = new ArrayList<TrackPanel>();      //Leeg de lijst met TrackPanels.
        for (int i = 0; i < cache.size(); i++)                     //Voeg voor elk object in cache (ArrayList) een trackPanel toe aan de JPanel
        {
            TrackPanel tp = new TrackPanel(cache.get(i), getWidth());
            trackPanels.add(tp);                                     //Toevoegen aan lijst
            trackPanel.add(tp);                                       //Toevoegen aan JPanel
        }
        System.out.println(cache.size());
        if (cache.size() == 0)                                         //Wanneer de cache leeg is, laat een bericht zien dat deze leeg is.
        {
            trackPanel.add(new TrackPanel(new Track("test", "test", "9"), getWidth()));
        }

        //Het volgende werkt ook niet.
        repaint();
        trackPanel.repaint();
        for (int i = 0; i < trackPanels.size(); i++)
        {
            trackPanels.get(i).repaint();
            System.out.println("repainting");
        }
    }

De eerste keer, als de cache niet leeg is, komt de volledige cache in beeld (als TrackPanels). Als ik de cache leeg door alle checkboxes aan te klikken en op de verwijderknop te drukken, verdwijnt alles, maar verschijnt de nieuwe "Test" TrackPanel niet (De JPanel trackPanel blijft leeg). Wanneer ik echter het venster minimaliseer, en weer tevoorschijn tover, staat deze "Test" er wel.. Ook het toevoegen van de vele repaints werkt ook niet..

Heeft iemand een idee?

attachment.php
attachment.php
attachment.php


[Screenshot 1] Begin. Na het klikken op de checkbox en op delete selected komen we in [Screenshot 2]. Nu moet er dus het beeld ontstaan zoals in [Screenshot 3], screenshot 3 ontstaat na het minimaliseren en de-minimaliseren (ofzoiets).
 

Bijlagen

  • 1.png
    1.png
    19,5 KB · Weergaven: 60
  • 2.png
    2.png
    14,1 KB · Weergaven: 55
  • 3.png
    3.png
    15,4 KB · Weergaven: 56
Laatst bewerkt:
Dit is de volledige klasse:

Code:
public class ViewCacheFrame extends JFrame implements Observer
{

    /* Singleton instance for this ViewCacheFrame. */
    private static ViewCacheFrame viewCacheFrame = new ViewCacheFrame();
    /* The Cache to show */
    private Cache<Track> cache;
    /* Components */
    private JScrollPane scrollPane;
    private JPanel trackPanel;
    private ArrayList<TrackPanel> trackPanels;

    private ViewCacheFrame()
    {
        setMinimumSize(new Dimension(250, 350));
        setLocationRelativeTo(null);
        setResizable(false);
        init();
    }

    public void init()
    {
        setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
        trackPanel = new JPanel();
        trackPanel.setLayout(new BoxLayout(trackPanel, BoxLayout.Y_AXIS));

        trackPanels = new ArrayList<TrackPanel>();

        scrollPane = new JScrollPane(trackPanel);
        scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        add(scrollPane);
        add(new Box.Filler(new Dimension(0, 5), new Dimension(0, 5), new Dimension(0, 5)));

        JButton deleteButton = new JButton("Delete selected");
        add(deleteButton);
        deleteButton.addActionListener(new ActionListener()
        {

            public void actionPerformed(ActionEvent e)
            {

                int a = JOptionPane.showConfirmDialog(null, "Are you sure you want to delete the selected tracks?", "Delete selection", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
                if (a == 0)
                {
                    for (int i = 0; i < trackPanels.size(); i++)
                    {
                        if (trackPanels.get(i).getTrack().equals(cache.get(i)))
                        {
                            cache.remove(i);
                            System.err.println("removed");
                        }
                    }
                    refresh();
                } else
                {
                    for (int i = 0; i < trackPanel.getComponentCount(); i++)
                    {
                        if (trackPanel.getComponent(i) instanceof TrackPanel)
                        {
                            ((TrackPanel) trackPanel.getComponent(i)).setSelected(false);
                        }
                    }
                }
            }
        });

        add(new Box.Filler(new Dimension(0, 5), new Dimension(0, 5), new Dimension(0, 5)));
    }

    public void refresh()
    {
      //  cache.add(new Track("test", "test", "9"));
        trackPanel.removeAll();
        trackPanels = new ArrayList<TrackPanel>();
        for (int i = 0; i < cache.size(); i++)
        {
            TrackPanel tp = new TrackPanel(cache.get(i), getWidth());
            trackPanels.add(tp);
            trackPanel.add(tp);
        }
        System.out.println(cache.size());
        if (cache.size() == 0)
        {
            trackPanel.add(new TrackPanel(new Track("test", "test", "9"), getWidth()));
        }

        repaint();
        trackPanel.repaint();
        for (int i = 0; i < trackPanels.size(); i++)
        {
            trackPanels.get(i).repaint();
            System.out.println("repainting");
        }
    }

    public static ViewCacheFrame getInstance()
    {
        return viewCacheFrame;
    }

    public void setCache(Cache<Track> cache)
    {
        this.cache = cache;
    }

    @Override
    public void setVisible(boolean b)
    {
        refresh();
        super.setVisible(b);
    }

    public void update(Observable o, Object arg)
    {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}
 
Kan je niet beter een gewone JList gebruiken en dan zelf een JListCelRenderer schrijven ?

Je ListModel is dan list<Tracks> en als CelRenderer kan je TrackPanel gebruiken.

Als je in de ListModel tracks toevoegt of verwijdert, wordt automatich je JList bijgewerkt, werkt een stuk gemakkelijker.
 
Dat zou inderdaad kunnen, ik heb het met een JList geprobeerd, maar dan krijg je alleen een regeltje tekst. Als je zoals jij zegt met een JListCelRenderer een eigen JPanel kunt toevoegen, is dat natuurlijk helemaal goed. Ik zal er eens naar kijken, bedankt! :thumb:
 
Ik heb nu dit:

PHP:
public void init() {
        trackList = new JList(new AbstractListModel() {

            public int getSize() {
                return cache.size();
            }

            public Object getElementAt(int index) {
                return cache.get(index); //een Track
            }
        });

        trackList.setCellRenderer(new TrackCellRenderer());
        trackList.addListSelectionListener(new ListSelectionListener() {

            public void valueChanged(ListSelectionEvent e) {
                JList source = (JList) e.getSource();
                TrackPanel tp = (TrackPanel) source.getSelectedValue(); //levert een Track op, geen TrackPanel
                tp.changeSelected();
            }
        });
        add(trackList);
    }

PHP:
private class TrackCellRenderer implements ListCellRenderer {

        public Component getListCellRendererComponent(final JList list, final Object value, final int index, final boolean isSelected, final boolean cellHasFocus) {
            Track t = (Track) value;
            return new TrackPanel(t, getWidth());
        }
    }

Ik krijg inderdaad de TrackPanels te zien, maar ik kan de JCheckboxes in de TrackPanels niet aanklikken (deze veranderen niet). Als ik (zoals hierboven) een new ListSelectionListener() toevoeg aan de JList en deze op bovenstaande manier invul, krijg ik bij source.getSelectedValue() een Track terug, en geen TrackPanel (logisch). Hoe kan ik wél die checkbox gebruiken?
 
Hoi,

Voor je TrackCellRenderer kan je beter TrackPanel extenden. Je gebruikt dan 1 panel voor alle rijen in JList. (dit werkt sneller als je later veel rijen krijgt)

In je Track zal je boolean moeten hebben die aangeeft of je checkbox geselecteerd is .Als een track selecteerd, zal je deze boolean op true zetten en je moet dan in ListModel
fireContentsChange(..) moeten aanroepen. Dan wordt deze cell opnieuw getekend.

Je ListSelectionListener kan dus Track updaten en dit zal dus indirect je List updated.

Als je ListSelectionListener gebruikt zal wel een klik overal in je cell all je checkbox aanzetten. Als je dit niet wilt zal een MouseListener aan je list moeten toevoegen, in JList zitten wat methoden op coordinaten van je muis click om te zetten naar cell coordinaten..
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan