1

Swing コンポーネントを使用して GUI の奥深くでアイコンを変更するのに問題があります。私はJavaで楽しみのためにチェスゲームを作成しています.GUIの右側がグリッドに取られたピースを表示することによってピースが取られたときに応答するようにします. 私の問題は、新しい画像でsetIcon()関数を呼び出して適切なに追加するたびに、更新されないことです。初めてのときはうまくいきますが、GUIに追加した後は、思ったように変更できません。ここにスクリーンショットがあるので、私が何を得ているかがわかります:JLabelJPanelsetIcon()

初期状態

おわかりのように、ポーンが取られましたが、私の努力にもかかわらず、右側のパネルにはこれが反映されていません。

私はいくつかの調査を行いましたが、次の質問は似ていました:関連する質問

Camickr は、私が更新しようとしている JLabel の 2 つのインスタンスである可能性があると答えており、私の場合はそうなっていると思います。GUIを初期状態に設定するときに、最初に右側のパネルのすべてのアイコンをnullに設定しました。これを行うコードは次のとおりです。

for (int i = 0; i < 16; i++)
{
    piece1Labels[i] = new JLabel();
    piece2Labels[i] = new JLabel();
    piece1Panels[i] = new ChessSpace(playerDeadPieceTile);
    piece2Panels[i] = new ChessSpace(playerDeadPieceTile);
    piece1Labels[i].setPreferredSize(new Dimension(67,66));
    piece2Labels[i].setPreferredSize(new Dimension(67,66));
    piece1Labels[i].setIcon(null);
    piece2Labels[i].setIcon(null);
    piece1Panels[i].add(piece1Labels[i]);
    piece2Panels[i].add(piece2Labels[i]);
    player1PiecePanel.add(piece1Panels[i]);
    player2PiecePanel.add(piece2Panels[i]);
}

ChessSpaceそして、ここでは、拡張するpiece1Panels 配列の最初のパネルで初期化が呼び出された後に、これらのパネルの 1 つを変更しようとしていますJPanel

//Try to change right panel icon after GUI setup
    piece1Labels[0] = new JLabel();
    piece1Panels[0] = new ChessSpace(playerDeadPieceTile);
    piece1Labels[0].setPreferredSize(new Dimension(67,66));
    piece1Labels[0].setIcon(new ImageIcon("C:/Users/Shasta/workspacejava/chess/images/terranpawn.jpg"));
    piece1Panels[0].add(piece1Labels[0]);

piece1Labels と piece1Panels は、クラス拡張の変数ですJFrame。問題は、クラス変数を更新しているだけで、GUI に追加されたインスタンスを更新していないことだと思います。

編集: Alican Ozgoren & Hovercraft Full Of Eels が指摘したように、 の新しいインスタンスを宣言するべきではありませんでしたJLabel。それらは冗長でした。

次のコード行は、私が望むことをしているようです:

//Try to change right panel icon after GUI setup
    piece1Labels[0].setIcon(new ImageIcon("C:/Users/Shasta/workspacejava/chess/images/terranpawn.jpg"));
4

2 に答える 2

0

JLable Icone を更新するスレッドを作成するだけです。以下のコードを参照してください。

パッケージself.wing.practice.image; import javax.swing.*;

/** * * @author ASHISH KUMAR MISHRA * */ public class ImageDemo {

public ImageDemo() {
    JFrame jfrm = new JFrame("Image Demo");
    jfrm.setSize(200, 150);
    jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JLabel label = new JLabel();
    jfrm.add(label);
    new ImageUpdator(label).start();
    jfrm.setVisible(true);

}

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {

        public void run() {
            // TODO Auto-generated method stub
            new ImageDemo();
        }
    });
}

}

Constructur で Jlabel を渡すスレッドを作成しました。私のスレッドが何をしているか以下を参照してください

パッケージself.wing.practice.image;

java.io.File をインポートします。

import javax.swing.ImageIcon; javax.swing.JLabel をインポートします。

/** * * @author ASHISH KUMAR MISHRA * */ public class ImageUpdator extends Thread {

String imagePath = "C:\\Users\\Public\\Pictures\\Sample Pictures";
File imageDir = new File(imagePath);
JLabel label = null;

ImageUpdator(JLabel label) {
    this.label = label;
}

public void run() {

    ImageIcon imageIcon = null;

    if (imageDir.isDirectory()) {
        File[] files = imageDir.listFiles();
        for (int i = 0;; i++) {
            i = i % files.length;
            File currentFile = files[i];
            if (currentFile.getName().endsWith(".jpg"))
                ;
            {
                imageIcon = new ImageIcon(currentFile.getAbsolutePath());
                label.setName(currentFile.getName().substring(0,
                        currentFile.getName().indexOf('.')));
                label.setIcon(imageIcon);
                label.setHorizontalAlignment(JLabel.CENTER);
                try {
                    Thread.sleep(700);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }

        }
    }
}

}

見出し

于 2016-08-18T16:23:28.513 に答える