2012-09-19 67 views
1

大家好我有這個問題,我似乎無法修復。我已經給了一些代碼,並且必須製作一個「tic tac toe」遊戲。相當原始。目前,我想要做的就是接受用戶輸入(它只是詢問你想要放置標記的行/列),它的目的是在電路板的相應方格上畫一個橢圓。我目前的代碼如下所示,工作已經指定我創建一個新類來處理用戶輸入。將項目添加到JFrame強制它們落後?

我目前只是試圖讓它添加新的項目到JFrame,但我沒有成功。我有一個虛擬的輸入呼叫,它不檢查我輸入的內容,而只是調用一個橢圓,它應該坐在左上角的第一個方格中。我可以將對象繪製到JFrame上(儘管它佔用了整個框架),但它始終放在實際板子的後面(即:如果我拉伸框架,我可以看到該圓圈)。我已經嘗試添加JPanels等,以便他們坐在董事會的頂部,但到目前爲止我沒有運氣。

下面是創建橢圓的代碼,我爲這個任務創建了橢圓。我正在做的是實例化一個新的位置爲(0,0,10,10)的橢圓。當它繪製時,它佔用整個JFrame,但它也是在實際的板子......任何想法?

package lab4; 

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

/** Oval Supplier Class 
* Author: David D. Riley 
* Date: April, 2004 
*/ 
public class Oval extends JComponent { 

    /** post: getX() == x and getY() == y 
    *   and getWidth() == w and getHeight() == h 
    *   and getBackground() == Color.black 
    */ 
    public Oval(int x, int y, int w, int h) { 
     super(); 
     setBounds(x, y, w, h); 
     setBackground(Color.black); 
    } 

    /** post: this method draws a filled Oval 
    *   and the upper left corner of the bounding rectangle is (getX(), getY()) 
    *   and the oval's dimensions are getWidth() and getHeight() 
    *   and the oval's color is getBackground() 
    */ 
    public void paint(Graphics g) { 
     g.setColor(getBackground()); 
     g.fillOval(0, 0, getWidth()-1, getHeight()-1); 
     paintChildren(g); 
    } 

} 

編輯:這是現在的代碼,我們正在尋找AT--

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package lab4; 

/** 
* 
* @author Scott 
*/ 
import java.awt.*; 
import java.util.Scanner; 
import javax.swing.*; 

public class GameBoard { 

    private JFrame win; 
    private int count = 1; 

    //Create new GUI layout 
    GridLayout layout = new GridLayout(3, 3); 
    JPanel panel = new JPanel(layout); 

    //Create a new Array of Rectangles 
    Rectangle[][] rect = new Rectangle[3][3]; 

    public GameBoard() { 


     //Create new JFrame + Set Up Default Behaviour 
     win = new JFrame("Tic Tac Toe"); 

     win.setBounds(0, 0, 195, 215); 
     win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     win.setResizable(true); 

     //Loop goes through each line of the array. It creates a new rectangle 
     //determines it's colour based on modulus division 
     //Add's the rectangle to the JPanel. 
     for (int i = 0; i < rect.length; i++) { 
      for (int j = 0; j < rect[i].length; j++) { 
       rect[i][j] = new Rectangle(0, 0, 1, 1); 
       if (count % 2 != 0) { 
        rect[i][j].setBackground(Color.black); 
       } else { 
        rect[i][j].setBackground(Color.red); 
       } 
       panel.add(rect[i][j]); 
       count++; 
      } 
     } 


     //Sets the game to be visible. 
     win.add(panel); 
     win.setVisible(true); 
     //userInput(); 
    } 

    private void userInput() { 
    Scanner scan = new Scanner(System.in); 
    } 
} 
+0

你爲什麼使用'paint'?除了你沒有調用'super.paint',你應該使用'paintComponent' – MadProgrammer

+0

好吧,我快速瀏覽了你的代碼,它絕對沒有辦法讓你的'GameBoard'方法工作。 'JFrame'不通過任何'add'方法接受'Rectangle',我知道它通常需要一個'Component'。如果沒有適當的[SSCCE](http://sscce.org/),將會很難幫到您 – MadProgrammer

+0

您如何將您的Oval組件添加到JFrame?如果您只是簡單地調用add(new Oval())並且保留了JFrame內容窗格的默認LayoutManager,那麼您將使用BorderLayout來覆蓋對setBounds的調用並使橢圓佔據整個區域。 –

回答

0

回答結束了,我需要堅持使用流佈局的佈局管理器,手動大小的矩形和改用JLayeredPane。我沒有意識到這是存在的,與我的講師談過話,他說我的思維過程是正確的,這是他打算讓我這麼做的方式......多虧了那些幫助過的人,這是多麼痛苦的一件事。

1

讓我們先從你的橢圓形類...

這是一個非常糟糕的主意..

public void paint(Graphics g) { 
    // No super.paint(g) call, hello to a world of pain... 
    // Paint some stuff 
    g.setColor(getBackground()); 
    g.fillOval(0, 0, getWidth()-1, getHeight()-1); 
    // Then draw the children over it...??? 
    paintChildren(g); 
} 

這是一個更好的方法。

protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g.setColor(getBackground()); // Might want to pick a better color... 
    g.fillOval(0, 0, getWidth()-1, getHeight()-1); 

} 

在猜測,我建議你的窗口是使用是壓倒你setBounds通話

+0

我不能改變我的導師給我的橢圓形課程,所以必須保持原樣。我使用默認的佈局管理器,我相信它只是流佈局,我最好建議看看另一個佈局管理器?給我指引的頁面並沒有說明我需要這樣做。我也是在這樣的假設下,那些在其他東西之後添加的東西,比如堆疊紙張......一天中大部分時間都在做Java,所以我會休息一個小時左右,然後看看我現在是否得到了一線光線或答案。 – Scott

+0

我開始使用'GridLayout' – MadProgrammer

+1

@gRnt可能沒有選擇告訴你的導師過來學習一些擺動,然後教你最壞的做法;-) – kleopatra