Java 每次单击JList,重新绘制JPanel

Java 每次单击JList,重新绘制JPanel,java,swing,jpanel,jlist,mouse-listeners,Java,Swing,Jpanel,Jlist,Mouse Listeners,每次单击JList项目时,我都需要清除并刷新当前面板并加载另一个面板,该面板通过“populateWithButtons()”方法返回。temp是一个int变量,用于存储在JList上单击的内容。如何纠正以下问题 list_1.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent evt) {

每次单击JList项目时,我都需要清除并刷新当前面板并加载另一个面板,该面板通过“populateWithButtons()”方法返回。temp是一个int变量,用于存储在JList上单击的内容。如何纠正以下问题

        list_1.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent evt) {

                //refresh + populate JPanel
                Food food = new Food();             
                JPanel panel2 = new JPanel();
                JPanel pane11 = new JPanel();


                panel2.add(panel1);
                panel1.validate();
                panel1.repaint();
                panel1.setBounds(153, 74, 281, 269);

                panel1.add(food.populateWithButtons(temp));             
                contentPane.add(panel2);
        }
添加到
contentPane
后,移动
validate()
repaint()
,此时将重新绘制

  • 不要使用

  • 添加到而不是,否则需要将鼠标点转换为JList中的项目

  • 使用而不是添加,在运行时删除s,然后从
    ListSelectionListener
    ListSelectionModel
    SINGLE
    …)进行选择,以切换准备好的卡(
    JPanel
    ,带有某些内容)

  • 编辑

    导入java.awt.BorderLayout;
    导入java.awt.CardLayout;
    导入java.awt.Color;
    导入java.awt.Dimension;
    导入java.util.Vector;
    导入javax.swing.JFrame;
    导入javax.swing.JList;
    导入javax.swing.JPanel;
    导入javax.swing.JScrollPane;
    导入javax.swing.ListSelectionModel;
    导入javax.swing.SwingUtilities;
    导入javax.swing.event.ListSelectionEvent;
    导入javax.swing.event.ListSelectionListener;
    公共类CardlayoutTest{
    私有颜色[]颜色=新颜色[]{Color.BLACK,Color.RED,Color.GREEN,Color.BLUE};
    私有JFrame=新JFrame();
    私有JList list=新JList();
    private JPanel panel=new JPanel();
    私人卡布局卡=新卡布局();
    公共CardlayoutTest(){
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    面板设置布局(卡片);
    向量项=新向量();
    对于(int x=0;x
    首先将all设置为实例变量,而不是匿名本地变量。。面板。添加(面板)它是什么意思?。pupulateWithButtons(temp)返回什么?。请确保问题是可以理解的。对不起,我刚刚编辑了我的问题。为什么要创建一个新的
    JPanel panel 2
    并调用
    removeALL()
    ?一开始它是空的。你问了很多问题,但很少接受和回答。该是你学会正确使用论坛并在得到帮助时接受答案的时候了。我很抱歉,但它不起作用。我知道我直接在GUI上工作。请你提供一个简短的例子好吗?你已经听取了你的建议并使用了ListSelectionListener。如何实现您的第三个建议?JList中的项表示卡(JPanel),反之亦然。您有10个单独的视图,为每个视图创建JPanel,将此JPanel作为卡放入CardLayout,它具有CardLayout的字符串描述,然后将相同的字符串作为新项放入JList,ListSelectionListener返回字符串,将此字符串值作为CardLayout的参数传递,链接教程显示JComboBox,这与JList相同,似乎很复杂。我只想让JPanel刷新自己。谢谢你。无论如何,我感谢你的建议,这在此时可能不适用。我想这是几分钟的工作,嗯,你会扼杀我无尽的懒散,尽可能简单地等待
    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();
                }
            });
        }
    }