0

「更新」ボタンを使用してアイコンのパネルを更新しようとしていますが、このタスクを実行するためにイベント ハンドラーに何を入れればよいかわかりません。タスクを 1 回実行するためのコードがあります (以下)。誰かがこれで私を助けることができますか?

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

public class FourRandomCards extends JFrame {
    JButton jbtRefresh = new JButton("Refresh");
    CardsPanel cardsPanel = new CardsPanel();

    public FourRandomCards() {
    add(cardsPanel, BorderLayout.CENTER);
    add(jbtRefresh, BorderLayout.SOUTH);

//=============================================================
        /** can't figure out what to put in event-handler **/
        jbtRefresh.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

            }
        });
//=============================================================
    }


    public static void main(String[] args) {
        JFrame frame = new FourRandomCards();
        frame.setTitle("Four Random Cards");
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    private class CardsPanel extends JPanel {
        public CardsPanel() {
            for (int i = 0; i < 4; i++) {
                int card = (int)(Math.random() * 54 + 1);
                ImageIcon cardIcon = new ImageIcon
                ("image/card/" + card + ".png");
                JLabel jlblCard = new JLabel(cardIcon);

                add(jlblCard);
            }
        }
    }
}
4

1 に答える 1

1

基本的に、既存のコンポーネントをすべて削除して、再度追加する必要があります。これは、この要件を満たすことができる何らかの方法が必要であることを示唆しています。

ローカル変数を使用しているため、変数を作成するか、クラスのインスタンス変数を使用cardsPanelしない限り、変数にアクセスできません...final

public class FourRandomCards extends JFrame {
    JButton jbtRefresh = new JButton("Refresh");
    final CardsPanel cardsPanel = new CardsPanel();

    public FourRandomCards() {
    add(cardsPanel, BorderLayout.CENTER);
    add(jbtRefresh, BorderLayout.SOUTH);

//=============================================================
        /** can't figure out what to put in event-handler **/
        jbtRefresh.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                cardsPanel.refresh();
            }
        });
//=============================================================
    }


    public static void main(String[] args) {
        JFrame frame = new FourRandomCards();
        frame.setTitle("Four Random Cards");
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    private class CardsPanel extends JPanel {
        public CardsPanel() {
            refresh();
        }

        public void refresh() {
            removeAll();
            for (int i = 0; i < 4; i++) {
                int card = (int)(Math.random() * 54 + 1);
                ImageIcon cardIcon = new ImageIcon
                ("image/card/" + card + ".png");
                JLabel jlblCard = new JLabel(cardIcon);

                add(jlblCard);
            }
            revalidate();
            repaint();
        }
    }
}
于 2013-08-31T10:06:42.657 に答える