3

さて、helpButton が押されたときに背景画像を変更したいと思います。Mouse Listener を使用して、マウスをボタンの上に置いたときにボタンの画像を変更できます。アクションリスナーを除いて同じ手順を実行しましたが、成功しませんでした。どんな助けでも素晴らしいでしょう!

public class test extends JFrame{

    private JLabel label;
    private JButton button;

    private ImageIcon bgi;
    private JLabel bgl;

    public static Rectangle gameSquare;


    private JButton startButton;
    private JButton helpButton;
    private final Action action = new SwingAction();


    public static void main(String[] args) throws MalformedURLException, IOException {
        test gui = new test ();
        gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // when click x close program
        gui.setSize(902, 305);
        gui.setVisible(true);
        gui.setTitle("Solid Cloud Inc - Twitter Unfolower");
    }

    public test() throws MalformedURLException, IOException{

        bgi = new ImageIcon(getClass().getResource("tu.png"));
        getContentPane().setLayout(null);

        BufferedImage img = ImageIO.read(new URL("http://i1344.photobucket.com/albums/p656/SolidCloudInc/start_zpsf3781681.png"));
        //ImageIcon start = new ImageIcon(getClass().getResource("start.png"));
        startButton = new JButton("");
        startButton.setIcon(new ImageIcon(img));
        startButton.setBounds(22, 186, 114, 50);


        getContentPane().add(startButton);

        BufferedImage img2 = ImageIO.read(new URL("http://i1344.photobucket.com/albums/p656/SolidCloudInc/help_zpsc4fad867.png"));
        final JButton helpButton = new JButton("");
        helpButton.setIcon(new ImageIcon(img2));
        helpButton.setBounds(192, 186, 114, 50);

        getContentPane().add(helpButton);

        bgl = new JLabel (bgi);
        bgl.setBounds(0, 0, 886, 272);
        getContentPane().add(bgl);

        Events e = new Events();
        startButton.addActionListener(e);
        helpButton.addActionListener(e);
    }

    public class Events implements ActionListener {


        public void actionPerformed(ActionEvent e) {

            if (e.getSource() == startButton) {
               label.setText("Searching");

               try {
                Unfollow();
            } catch (InterruptedException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            }
            else if (e.getSource() == helpButton){
                System.out.println("gottem");
                bgi = new ImageIcon(getClass().getResource("tu2.png"));
            bgl = new JLabel (bgi);
            }
    }

    }
4

1 に答える 1

4
bgl = new JLabel (bgi);

ここでは、新しい JLabel を作成し、それを bgl 変数に入れていますが、それで何かを行っており、GUI に引き続き表示される JLabel オブジェクトに変更を加えていません。変数の参照を変更することによって、変数が以前に参照していた元のオブジェクトの状態が変更されると考えるのは、よくある初心者の罠です。それはそれがどのように機能するかではありません。つまり、bgl 変数によって保持されていた元の JLabel はまだ存在し、上記のコードにもかかわらず、元のコンテンツを GUI に表示します。代わりにすべきことは、元の JLabel によって表示されるアイコンを変更することです。つまり、bgl 変数が保持する参照を変更するのではなく、現在の JLabel オブジェクトの状態を変更することです。つまり、

bgl.setIcon(bgi);

また、null レイアウトの使用と への呼び出しをすべて削除する必要がありますsetBounds(...)。これにより、バグが発生し、コードの保守とアップグレードが困難になります。GUI のレイアウトに関する面倒な作業は、レイアウト マネージャーに任せてください。

于 2013-06-10T23:59:10.520 に答える