2011-10-19 9 views
-1

私はチェスプログラムを書いています。私はポーンの宣伝に取り組んでいます。ポーンが最終ランクに達すると、新しいjframeがポップアップして、ポーンを昇格させたいピースをユーザーが選択できるようになります。問題は、私のメインメソッドからこのフレームを作成すると、うまく表示されますが、私のmouselistenerコード内に作成すると、画面上に何が表示されているのか正確に表示されます。ここに私の関連するコードです:不正な内容を表示しているJFrame

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

public class Example extends JFrame { 

private SquarePanel[][] squares; 
private Colors colors; 

public Example() { 
    super(); 
    colors = new Colors(); 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    Container con = this.getContentPane(); 
    setSize(800,800); 
    setLocation(0,0); 
    con.setLayout(new GridLayout(8,8)); 
    SquarePanel pane = null; 
    SquarePanel lastpanel = null; 
    squares = new SquarePanel[8][8]; 
    int color = colors.WHITE; 

    for(int i = 7; i >= 0; --i) { 

     if(color == colors.WHITE) 
      color = colors.BLACK; 
     else 
      color = colors.WHITE; 

     for(int j = 0; j <= 7; ++j) { 

      if(color == colors.WHITE) 
       color = colors.BLACK; 
      else 
       color = colors.WHITE; 

      lastpanel = new SquarePanel(color,j,i); 
      pane = lastpanel;    
      con.add(pane); 
      squares[j][i] = pane; 
     } 
    } 

    for(int i = 0; i < 8; ++i) { 
     for(int j = 0; j < 8; ++j) { 
      squares[j][i].setResident("pawn"); 
      //System.out.println(squares[j][i].getResident()); 
      //squares[j][i].repaint(); 
     } 
    } 

    MouseListener listener = new MoveListener(this, squares); 
    for(int i = 0; i < 8; ++i) 
     for(int j = 0; j < 8; ++j) 
      squares[i][j].addMouseListener(listener); 
    setVisible(true); 
    PromotionFrame pf = new PromotionFrame(this, 1); 
    String p = null; 

    while(p == null) { 
     p = pf.getPiece(); 
    } 

    pf.dispose(); 
} 

public class SquarePanel extends JPanel { 
    private ImageIcon content; 
    private int x; 
    private int y; 
    private int color; 
    private String resident; 
    private Colors colors; 

    public SquarePanel(int color, int x, int y) { 
     content = null; 
     resident = null; 
     this.color = color; 
        colors = new Colors(); 
     this.x = x; 
     this.y = y; 
     Border blackline = BorderFactory.createLineBorder(Color.black); 
     setBorder(blackline); 
     this.setLayout(new GridBagLayout()); 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     int width = getWidth(); 
     int height = getHeight(); 

     if(color == colors.WHITE) 
      g.setColor(Color.white); 
     else 
      g.setColor(Color.green); 

     g.fillRect(0, 0, width, height); 
     g.setColor(Color.black); 
     //System.out.println("here"); 
    } 

    public String getResident() { 
     return resident; 
    } 

    public void setResident(String p) { 
     resident = p; 

     if(p == null) 
      removeAll(); 
     else 
      add(new JLabel(p)); 
    } 

    public int getXCoordinate() { 
     return x; 
    } 

    public int getYCoordinate() { 
     return y; 
    } 
} 

private class Colors { 
    public int BLACK = 0; 
    public int WHITE = 1; 
} 

public class MoveListener implements MouseListener { 
    private int first_click; 
    private SquarePanel first_source; 
    private JFrame frame; 
    private int turn; 
    private SquarePanel[][] squares; 

    public MoveListener(JFrame f, SquarePanel[][] s) { 
     first_click = 0; 
     this.frame = f; 
     turn = colors.WHITE; 
     squares = s; 
    } 


    /* Empty method definition. */ 
    public void mousePressed(MouseEvent e) { 
     SquarePanel p = (SquarePanel)e.getSource(); 
     ImageIcon content = null; 

     if(first_click == 0) { 
      first_source = p; 
      ++first_click; 
      p.setBorder(BorderFactory.createLineBorder(Color.cyan,4)); 
     } 
     else { 
      first_click = 0; 
      first_source.setBorder(BorderFactory.createLineBorder(Color.black)); 
      //System.out.println(turn == colors.WHITE ? "White" : "Black"); 

      if(p.getResident().equals("pawn") && (p.getYCoordinate() == 7 || p.getYCoordinate() == 0)) { 
       PromotionFrame pframe = new PromotionFrame(frame, colors.WHITE); 
       String piece; 

       do { 
        piece = pframe.getPiece(); 
       } 
       while(piece == null); 

       System.out.println(piece); 
       pframe.dispose(); 
       p.setResident(piece); 
      } 

     } 

    } 

    /* Empty method definition. */ 
    public void mouseReleased(MouseEvent e) { 
    } 

    /* Empty method definition. */ 
    public void mouseEntered(MouseEvent e) { 
    } 

    /* Empty method definition. */ 
    public void mouseExited(MouseEvent e) { 
    } 

    public void mouseClicked(MouseEvent e) { 

    } 

} 

public class PromotionFrame extends JFrame implements MouseListener { 
    private JFrame master; 
    private String piece; 

    public PromotionFrame(JFrame master, int color) { 
     super(); 
     this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
     Container con = this.getContentPane(); 
     setSize(400,200); 
     this.master = master; 
     setLocation(master.getX()+master.getWidth()/2-200,master.getY()+master.getHeight()/2-100); 
     setLocation(0,0); 
     con.setLayout(new GridLayout(1,4)); 
     ImageIcon imgicon1; 
     Image img1; 
     Image newimg; 
     ImageIcon img; 
     ImageLabel label; 
     piece = null; 

     label = new ImageLabel("queen"); 
     label.addMouseListener(this); 
     con.add(label); 
     label = new ImageLabel("rook"); 
     label.addMouseListener(this); 
     con.add(label); 
     label = new ImageLabel("bishop"); 
     label.addMouseListener(this); 
     con.add(label); 
     label = new ImageLabel("knight"); 
     label.addMouseListener(this); 
     con.add(label); 

     this.show(); 
    } 

    public String getPiece() { 
     return piece; 
    } 

    /* Empty method definition. */ 
    public void mousePressed(MouseEvent e) { 
     ImageLabel label = (ImageLabel)e.getSource(); 
     piece = label.getPiece(); 
    } 

    /* Empty method definition. */ 
    public void mouseReleased(MouseEvent e) { 
    } 

    /* Empty method definition. */ 
    public void mouseEntered(MouseEvent e) { 
    } 

    /* Empty method definition. */ 
    public void mouseExited(MouseEvent e) { 
    } 

    public void mouseClicked(MouseEvent e) { 

    } 

    private class ImageLabel extends JLabel { 
     private String piece; 

     ImageLabel(String piece) { 
      super(piece); 
      this.piece = piece; 
     } 

     public String getPiece() { 
      return piece; 
     } 
    } 
} 

public static void main(String[] args) { 
    new Example(); 

} 
} 
+1

をどのように動作するかを再度読み込んでくださいということを再利用、一度だけPromotionFrameコードを作成[SSCCE](http://pscode.org/sscce.html)を投稿してください。 –

+0

**すべて**このコードは質問に厳密に関連していますか? – Vlad

+0

あなたの行っていることを見て理解するコードが多すぎます。 1つのコメントは、GUIのメインラインにdo/whileループを持つべきではないということです。 – camickr

答えて

1

1)変更の主

public static void main(String[] args) { 
    java.awt.EventQueue.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      Example example = new Example(); 
     } 
    }); 
} 

2)

あなたのポップアップPromotionFrameあなたは慎重に、すべてのもMouseEventにそれを作成した内部MouseListenerので、凍結して、おそらく、単純なMouseListenerが信頼できない量のEventsを生成した場合は、PromotionFrame_s

A)

class PromotionFrame extends JDialog implements MouseListener { 

B)

this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 



setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 

C)

あなたは、4つの異なる定義でTHIコードブロック1のJLabelを意味しなかったものを、そして最後に現在のコードのために

有効です。
 label = new ImageLabel("queen"); 
     label.addMouseListener(this); 
     con.add(label); 
     label = new ImageLabel("rook"); 
     label.addMouseListener(this); 
     con.add(label); 
     label = new ImageLabel("bishop"); 
     label.addMouseListener(this); 
     con.add(label); 
     label = new ImageLabel("knight"); 
     label.addMouseListener(this); 
     con.add(label); 

d

this.show(); 

this.setVisible(true); 

にe)の別のアクションまたはイベント

3)のために、LayoutManagersが早いほど良いのヘルプについて

+0

私はあなたの答えが問題を解決するとは思わない。私の例では3つのクラスがありますが、それらはすべて内部クラスです。すべてのものをExample.javaというファイルにコピーすると、コンパイルして実行する必要があります。あなたがそれを実行する場合は、プロモーションフレームが正しく表示されますし、私の指示に従い、1つの正方形をクリックすると、一番上の行の任意の四角形、プロモーションフレームが再び表示されますが、正しく表示されません – yemista

+0

も、プロモーションフレームはマウスクリック1回につき1回だけ作成され、その後、回答をポーリングして回答を受け取ると消えます – yemista

関連する問題