0

Swing に再生/一時停止ボタンを実装しようとしています。次のように JLabel を開始します。

PlayLabel = new JLabel(new ImageIcon(playPNG));
PlayLabel.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent arg0) {
                PlayLabel.setIcon(new ImageIcon(pausePNG));
            }
        });

これはうまくいきます。PlayLabelimageSourceをクリックすると変更されます。しかし、私の一時停止メソッドでは、これは機能しません:

private void doPause()
    {
        System.out.println("PAUSED");
        player.pauseCurrentTrack();
        PlayLabel.setIcon(new ImageIcon(playPNG));
    }

この JLabel は ImageIcon を元に戻さないplayPNG

4

2 に答える 2

2

次の例は、実行したいことを示していますが、アイコンではなくテキストを使用しています。プログラムは、画像、テキスト、または表示するものを切り替えます。

JLabel を使用した理由がフラット ボタンが必要だった場合は、次のコードを追加できます。

    private void makeButtonFlat(final JButton makeMeAFlatButton) {
        makeMeAFlatButton.setOpaque(false);
        makeMeAFlatButton.setFocusPainted(false);
        makeMeAFlatButton.setBorderPainted(false);
        makeMeAFlatButton.setContentAreaFilled(false);
        makeMeAFlatButton.setBorder(BorderFactory.createEmptyBorder());
    }

からこれを呼び出します

    public void makeLayout() {
        makeButtonFlat(playButton);
        add(playButton);
    }

これは JLabel のように見えますが、より論理的なボタンとして機能します。

実行中のプログラム

コードスニペット:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class Playful {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame("Playful");
                JPanel playPanel = new PlayPanel();
                frame.getContentPane().add(playPanel, BorderLayout.CENTER);
                frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
                frame.setMinimumSize(new Dimension(400, 250));
                frame.setLocationRelativeTo(null); // Center
                frame.pack();
                frame.setVisible(true);
            }
        });
    }

    static class PlayPanel extends JPanel {

        enum State {
            PLAY,
            PAUSE;

            public State toggle() {
                switch (this) {
                    case PLAY:
                        return PAUSE;
                    case PAUSE:
                        return PLAY;
                    default:
                        throw new IllegalStateException("Unknown state " + this);
                }
            }
        }

        private State state;
        private JButton playButton;
        private ActionListener playActionListener;

        PlayPanel() {
            createComponents();
            createHandlers();
            registerHandlers();
            makeLayout();
            initComponent();
        }

        public void createComponents() {
            playButton = new JButton();
        }

        public void createHandlers() {
            playActionListener = new AbstractAction() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    SwingUtilities.invokeLater(new Runnable() {
                        @Override
                        public void run() {
                            toggleState();
                        }
                    });
                }
            };
        }

        public void registerHandlers() {
            playButton.addActionListener(playActionListener);
        }

        public void makeLayout() {
            add(playButton);
        }

        public void initComponent() {
            state = State.PAUSE;
            updatePlayButton();
        }

        private void toggleState() {
            state = state.toggle();
            updatePlayButton();
        }

        private void updatePlayButton() {
            playButton.setText(state.name());
        }
    }
}
于 2012-11-11T15:34:12.690 に答える
2

JToggleButtonこの文脈ではより適しているかもしれません。メソッドは、setIcon()提案どおりに機能するはずです。参考までに、このList<JToggleButton>では、継続的に変化する から の各ボタンを更新していますList<Icon>。それは何らかの洞察を提供したり、あなたの基礎を形成したりするかもしれませ

画像

于 2012-11-11T15:20:10.363 に答える