Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

Swingのエラー

Javaを初めたてくらいの初心者です。いまオセロを自分で作って見たいと思い作っているのですが、駒を自動でひっくり返るようにするプログラムを描きたいと思い自分なりに書いてみたところ、エラーがでました。エラーについて調べたのですがよくわかりませんでした。どなたかわかる方はいらっしゃいますか?
エラー文は
0 0(駒のボタンの配列[][])
Exception in thread "AWT-EventQueue-0"
 change
java.lang.ArrayIndexOutOfBoundsException: 60
    at osero.Board.change(Board.java:117)
    at osero.Board.mouseClicked(Board.java:87)
    at java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:270)
    at java.awt.Component.processMouseEvent(Component.java:6538)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
    at java.awt.Component.processEvent(Component.java:6300)
    at java.awt.Container.processEvent(Container.java:2236)
    at java.awt.Component.dispatchEventImpl(Component.java:4891)
    at java.awt.Container.dispatchEventImpl(Container.java:2294)
    at java.awt.Component.dispatchEvent(Component.java:4713)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4534)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
    at java.awt.Container.dispatchEventImpl(Container.java:2280)
    at java.awt.Window.dispatchEventImpl(Window.java:2750)
    at java.awt.Component.dispatchEvent(Component.java:4713)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.awt.EventQueue$4.run(EventQueue.java:731)
    at java.awt.EventQueue$4.run(EventQueue.java:729)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)



プログラムは
public class Board extends JFrame implements MouseListener,MouseMotionListener{

     JButton jb[][]=new JButton[8][8];    //ボタン用の配列
     Container container;
     ImageIcon blackIcon,whiteIcon,boardIcon,myIcon,enemyIcon;
     int i,j,X,Y;
     public int turn=0; 

 public Board(){//パネルを表示
        this.setTitle("osero");
        this.setSize(400, 400);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        container=this.getContentPane();
        container.setLayout(null);//自動レイアウトを無効にする
        this.addMouseListener(this);
        this.addMouseMotionListener(this);



    
    whiteIcon=new ImageIcon("White.jpg");    //画像を登録    
    blackIcon = new ImageIcon("Black.jpg");
    boardIcon = new ImageIcon("GreenFrame.jpg");

    for(i=0;i<8;i++){        //ボタンを表示
        for(j=0;j<8;j++){
            jb[i][j]=new JButton(boardIcon);
            container.add(jb[i][j]);
            jb[i][j].setBounds(j*40+30, i*40, 40, 40);
            jb[i][j].addMouseListener(this);
            jb[i][j].addMouseMotionListener(this);
            jb[i][j]=new JButton(Integer.toString(i+j));
        }
    }

 }
 
 
 
 
    public static void main(String[] args) {
        Board gui=new Board();
        gui.setVisible(true);
    }
    @Override
    public void mouseDragged(MouseEvent e) {    
    }
    @Override
    public void mouseMoved(MouseEvent e) {
        
    }
    @Override
    public void mouseClicked(MouseEvent e) {//クリックされたときのアクション
        
        X=e.getXOnScreen();//横
        Y=e.getYOnScreen();//縦
        System.out.print((X-38)/40+" ");
        System.out.println((Y-30)/40);
        
        //System.out.println("クリック");
        JButton theButton=(JButton)e.getComponent();
        String jbIndex=theButton.getActionCommand(); 
        
        Icon theIcon=theButton.getIcon();
        //System.out.println(theIcon);
        //System.out.println(theButton);
        
        if(theIcon.equals(boardIcon)){        //画像を変更する
            theButton.setIcon(whiteIcon);
        }else if(theIcon.equals(whiteIcon)){
            theButton.setIcon(blackIcon);
        }else if(theIcon.equals(blackIcon)){
            theButton.setIcon(boardIcon);
        }    
        change();
        repaint();
    }
    
    @Override
    public void mousePressed(MouseEvent e) {        
    }
    @Override
    public void mouseReleased(MouseEvent e) {        
    }
    @Override
    public void mouseEntered(MouseEvent e) {
    }
    @Override
    public void mouseExited(MouseEvent e) {    
    }    

    public void change(){    
        System.out.println("change");
        if(turn%2==0){
            myIcon=blackIcon;
            enemyIcon=whiteIcon;
        }else {
            myIcon=whiteIcon;
            enemyIcon=blackIcon;
        }
        
        
        
        for(int sx=1;sx<8;sx++){        
        if(jb[X+sx][Y].equals(boardIcon)){
            break;
        }else if (jb[X+sx][Y].equals(myIcon)) {
            while(!(jb[X+sx][Y].equals(myIcon))){
                jb[X+sx][Y].setIcon(myIcon);
                sx--;
            }
            break;
        }
            repaint();
        //turn++;
        }
    }
}    
です(パッケージとインポート文は省略しています)
ひっくり返す前まではちゃんと動いています。
今のプログラムとしては、置いた駒の配列から縦(横?)の駒に置いた駒と同じ駒があるのかを調べ、あった場合置いた駒と置いた駒と同じ駒の間の駒を置いた駒と同じ駒にするようになっていると思います。。。
因みに、boardIconはなにも置かれていないところ、whiteIcon,blackIconはその色の駒のことです。

8

回答

461

閲覧

8件の回答

評価

0

>よくわかりませんでした
分かったこと、試したことを書こう。
これでは他の人にとっては、何も調べていないのと変わらない。

評価

0

エラーの1行目の
 Exception in thread "AWT-EventQueue-0"
を調べたところキャストできない型にキャストしようとしているためと出てきて、エラーの2行目が
at osero.Board.change(Board.java:117)
で、117行目は
if(jb[X+sx][Y].equals(boardIcon)){
だったので、配列とそのアイコンを比べることはできないのかな?と思い別のプログラムを試しで実行してみるとちゃんと実行でき、次に
if(theIcon.equals(boardIcon))
はうまくいっているようなので、theIconと同じように
Icon theIcon2=jb[X][Y].getIcon();
とし
if(theIcon2.equals(boardIcon))
としても、またエラーがでてお手上げ状態になっています。

評価

0

そこじゃない。
stacktraceの一行目で原因が解るとは限らない。というより、大きなものを作っていくと一行目で解ることはほとんどない。
今回の一行目は「このスレッドで例外が発生した」という意味に過ぎず、Swingではお決まりのものだ。二行目以降にある「Exception」の文字列を見つけよう。
下の方にcaused byとあればそこが原因のExceptionになっており、caused byはいくつも出ることがある。基本的には一番下のExceptionが根本原因だ。
この場合はcaused byがないので、二行目の
java.lang.ArrayIndexOutOfBoundsException: 60
に着目すれば良い。

評価

0

おや、ArrayIndexOutOfBoundsExceptionまでが一行目だったか?
まあ、いずれにしても着目すべきは「Exception」だ。

評価

0

原因がわかりました。
changeの配列のXは?
X=e.getXOnScreen();
で取得した値で、スクリーンの座標なので÷40をしないとボタンの配列にならないのに、割るのを忘れてました。
これで実行できるとおもったのですが、うまく動作せず
jb[X+sx][Y]のアイコンを表示させたところnullと表示されました。
jb[i][j]=new?JButton(boardIcon);
で、アイコンを設定しているのでboardIconと表示させたいのですが、、、
なぜnullになるのでしょうか??

評価

0

まずは自分で探ってみよう。
例えばブレークポイントを使って、変数が自分の思った通りに設定されているかを確認してみる。
ブレークポイントが分からなければSystem.out.println()でも良い。
そういう地道な調査が、力になって行くんだよ。

評価

0

説明不足でした。。。
nullは
Icon icon=jb[clickX+sx][clickY].getIcon();
            System.out.println(icon);
としたらでてきました。ボタンを配置しているところで.getIconとしてもnullと表示されるのですが、ボタンに設定したアイコンは.getIconでは参照できないのでしょうか?

評価

0

getIcon()について疑問なら、JButtonやgetIcon()についての情報を集める癖をつけよう。
質問はそれからだよ。

回答する

ログインしていません。

ログインしなくても回答はできますが、ログインすると、質問・回答の管理、更新があった場合のメールでの通知を受けることができます。 アカウントをお持ちでない方は会員登録を行ってください。

ユーザ名匿名