尝试刷新后,JPanel组件消失

时间:2015-01-21 00:00:29

标签: java swing jframe jpanel

我试图让它在框架中有两个面板。一个显示4张卡,另一个显示一个按钮。单击该按钮时,将再次随机选择四张卡。初始化程序或单击刷新时,卡不会显示。 任何人都可以解释我做错了什么以及我需要做些什么来解决这个问题?

这是我的代码

import java.awt.event.*;
import javax.swing.*;
import java.awt.*;

public class MyFrame extends JFrame{

    public MyFrame(){
        super("Random Cards");
        CardPanel cardPanel = new CardPanel();
        JPanel buttonPanel = new JPanel();
        JButton jbtRefresh = new JButton("Refresh");
        buttonPanel.add(jbtRefresh);
        add(cardPanel, BorderLayout.CENTER);
        add(buttonPanel, BorderLayout.SOUTH);

        jbtRefresh.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e){
                cardPanel.refresh();
            }
        });
    }

    public static void main(String[] args){
        MyFrame f = new MyFrame();
        f.setDefaultCloseOperation(MyFrame.EXIT_ON_CLOSE);
        f.setSize(500, 300);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public class CardPanel extends JPanel{
        JLabel l1;
        JLabel l2;
        JLabel l3;
        JLabel l4;

        void CardPanel(){
            refresh();
        }

        void refresh(){
            l1 =  new JLabel(new ImageIcon("image/card/" + (int)(1 + Math.random() * 54) + ".png"));
            l2 =  new JLabel(new ImageIcon("image/card/" + (int)(1 + Math.random() * 54) + ".png"));
            l3 =  new JLabel(new ImageIcon("image/card/" + (int)(1 + Math.random() * 54) + ".png"));
            l4 =  new JLabel(new ImageIcon("image/card/" + (int)(1 + Math.random() * 54) + ".png"));
            removeAll();
            add(l1);
            add(l2);
            add(l3);
            add(l4);
            repaint();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

简短回答

在致电revalidate ...

之前,在repaint之前致电refresh

更长,更合适的答案

请考虑使用CardLayout。有关详细信息,请参阅How to Use CardLayout

同时...

  • 确保仅在事件调度线程的上下文中创建/修改UI,有关详细信息,请参阅Initial Threads
  • 您可以考虑制作一个Card类,其类似于JPanel,它负责显示特定的卡片。这样,您可以简单地计算所需的随机卡值,并不断更新预先存在的实例,而不是每次都创建新实例。一般来说,它运行得更快,效率更高

Nit pick :您应该避免直接从顶级容器(例如JFrame)扩展UI,它们往往会将您锁定在单个用例中,并且难以重用或扩展未来。你还没有真正为框架添加任何新功能