repaint JPanel with every click at JList

后端 未结 2 1034
遥遥无期
遥遥无期 2021-01-25 17:40

everytime i click on a JList item, i need to clear + refresh my current panel & load another panel, returned via method \'populateWithButtons()\'. temp is an int variable th

相关标签:
2条回答
  • 2021-01-25 18:02
    1. don't to use NullLayout

    2. add ListSelectionListener to JList instead of MouseListener, otherwise you would need to convert point from mouse to Item in JList

    3. use CardLayout instead of add, remove JPanels on runtime, then selection from ListSelectionListener (ListSelectionModel to SINGLE...) to switch prepared card (JPanel with some contents)

    EDIT

    enter image description here

    .

    enter image description here

    .

    import java.awt.BorderLayout;
    import java.awt.CardLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.util.Vector;
    import javax.swing.JFrame;
    import javax.swing.JList;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.ListSelectionModel;
    import javax.swing.SwingUtilities;
    import javax.swing.event.ListSelectionEvent;
    import javax.swing.event.ListSelectionListener;
    
    public class CardlayoutTest {
    
        private Color[] colors = new Color[]{Color.BLACK, Color.RED, Color.GREEN, Color.BLUE};
        private JFrame frame = new JFrame();
        private JList list = new JList();
        private JPanel panel = new JPanel();
        private CardLayout card = new CardLayout();
    
        public CardlayoutTest() {
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            panel.setLayout(card);
            Vector<String> items = new Vector<String>();
            for (int x = 0; x < colors.length; x++) {
                JPanel pnl = new JPanel(new BorderLayout());
                pnl.setBackground(colors[x]);
                panel.add(pnl, colors[x].toString());
                items.add(colors[x].toString());
            }
            list = new JList(items);
            list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            list.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
                @Override
                public void valueChanged(ListSelectionEvent e) {
                    if (!e.getValueIsAdjusting()) {
                        String card = list.getSelectedValue().toString();
                        CardLayout cL = (CardLayout) (panel.getLayout());
                        cL.show(panel, card);
                    }
                }
            });
            frame.add(new JScrollPane(list), BorderLayout.WEST);
            frame.add(panel);
            frame.setPreferredSize(new Dimension(400, 150));
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new CardlayoutTest();
                }
            });
        }
    }
    
    0 讨论(0)
  • 2021-01-25 18:11

    move validate() and repaint() after adding to contentPane as in that point it will be redrawed.

    0 讨论(0)
提交回复
热议问题