2016-11-19 1 views
-1

보드 게임과 같은 자바 프로그램을 만들려고합니다. gametiles를 가지고 있는데, 현재 레이아웃을 올바르게 만들려고 할 때 단 하나의 색상 만 사용합니다. 타일이 창 너비의 절반 정도에 나타나서 바닥으로 확장되기를 원합니다. 어쩌면 9x9 또는 11x11 크기의 다른 타일로도 가능합니다. 필자는 그리드 레이아웃을 사용하여 이들을 서로 가깝게 만 드는 것이지 만지는 것은 아니지만 보드 게임처럼 보일 정도로 가까워 지도록 노력했습니다. 그러나, 내가 무엇을 시도하든간에, 타일은 공간이 너무 멀리 떨어져 있으며 창 크기를 조정할 때 모양이 바뀝니다. 나는 이것을 달성하기 위해 GridLayout 관리자를 사용 해왔다. 여기 내 코드가있다.JPanels 자바로 그리드 레이아웃

import java.awt.GridLayout; 
    import javax.swing.JFrame; 
    public class GameWindow extends JFrame { 

public GameWindow(String title){ 
    super(title); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setSize(1200,400); 
} 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    GameWindow gameWindow = new GameWindow("Game"); 
    gameWindow.setLayout(new GridLayout(0,2)); 
    GameTile greenTile = new GameTile(0,true,0,10); 
    GameTile greenTile2 = new GameTile(0,true,0,10); 
    gameWindow.add(greenTile); 
    gameWindow.add(greenTile2); 
    gameWindow.setVisible(true); 
} 
    } 

이것은 GameWindow.java 파일입니다. 많은 코드가 GameTile의 속성처럼, 아직 진행

import java.awt.Color; 
    import java.awt.Graphics; 
    import java.awt.Image; 
    import java.io.File; 
    import java.io.IOException; 
    import javax.imageio.ImageIO; 
    import javax.swing.JPanel; 
    /** 
    * @author Zachary Parks 
    * 
    */ 
    public class GameTile extends JPanel { 
    private Color color; 
    private Color[] colors = {Color.BLUE, Color.YELLOW, Color.BLACK}; 
    private int score, multiplier,initialX,initialY; 
    private boolean positiveEffect; 

    public GameTile(int colorTile, boolean effect, int initX, int initY){ 
    color = colors[colorTile]; 
    score = getScore(color); 
    multiplier = getMultiplier(color); 
    positiveEffect = effect; 
    initialX = initX; 
    initialY = initY; 
    } 
    protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Image image = null; 
    try { 
     image = ImageIO.read(new File("greentile.png")); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    g.drawImage(image,initialX,initialY,this); 
    } 

    private int getMultiplier(Color color2) { 
    return 0; 
    } 

    private int getScore(Color color2) { 
    return 0; 
    } 
    /** 
    * Method that returns the data from the tile in 
    * array of int. 0 index = added score, 1 index = tile effect score 
    * @return 
    */ 
    public int[] getData() { 
    int [] scoreData = null; 
    scoreData[0] = score*multiplier; 
    return null;  
    } 
    } 

입니다

모두 내가 노력하고있어 다음과 같다 : (여전히 주로 단지 테스트 완료되지 않습니다) 내가 지금까지 가지고있는 GameTile.java입니다 이 시점에서 타일은 서로 옆에 있습니다. 이 내가 얻고 무엇을 :

http://i.imgur.com/nXfrYSU.png

+0

그럼 정확히 무엇이 문제입니까? 배터리가 94 %이고 케이블을 연결합니까? – brummfondel

+0

그림 방법에서 파일 입출력을 수행하지 마십시오. 이미지는 클래스의 생성자에서 읽어야합니다. – camickr

+0

정말 그 패널과 레이아웃 관리자가 필요합니까? 왜 단순한 보드 종류를 찾고 있다면 왜 9x9 또는 11x11의 사각형을 그려 채우지 않습니까? – Arvind

답변

2

그리드와 같은 타일을 추가하려면. 변수는 tileSize입니다. 이미지/타일이 32 픽셀이라고 가정 해 보겠습니다. 이와

public static final tileSize = 32; 

, 우리는 지금 루프를 사용하여 타일을 추가 할 수 있습니다

for(int x = 0; x < SCREEN_WIDTH/GameTile.tileSize; x++) { // loop through as many tiles fit the x-axis. 
    for(int y = 0; y < SCREEN_HEIGHT/GameTile.tileSize; y++) { // do the same with y-axis 
     GameTile greenTile = new GameTile(0,true, x * GameTile.tileSize , y * GameTile.tileSize); 
     gameWindow.add(greenTile); 
    } 
} 

SCREEN_WIDTHSCREEN_HEIGHT이 JFrame의 크기입니다. 전체 화면에서이 루프를 염두에 두십시오. 절반을 원했지만 쉽게 구성 할 수 있습니다.

코드를 다음 번에 포맷하고 (탭 입력), 읽고 사용하기가 훨씬 쉽습니다. image = ImageIO.read(new File("greentile.png"));을 생성자로 이동하는 것이 좋습니다. 지금은 성능 저하를 유발할 모든 gameTile에 대한 모든 프레임 속도의 이미지를로드하고 있습니다.

또한 모든 GameTile에 JPanel이 없습니다. 대신 ArrayList

public static ArrayList<GameTile> gameTiles = new ArrayList<GameTile>(); 

protected void paintComponent(Graphics g) { 
    for(int i = 0; i < gameTiles.size(); i++) { 
     gameTiles.get(i).draw(g); 
    } 

을 사용 그래서 그 대신 모든 gameTile의 JFrame의에 JPanel을 추가 모든 GameTiles를 통해 기본 드로잉 클래스와 루프에 보관, 우리는 지정된 좌표에 gameTiles는립니다. 행운을 빕니다!

는 주석 필드에서 귀하의 질문에 대답하려면 : 코드는 extends JPanel를 제거하십시오 GameTile 클래스이

public class GameWindow extends JPanel { 

    public static ArrayList<GameTile> gameTiles = new ArrayList<GameTile>(); 

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

    public GameWindow() { 

     JFrame frame = new JFrame();  
     frame.setSize(300, 300); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(this); 
     frame.setVisible(true); 

     // add all the tiles (I just use x and y as parameters here) 
     gameTiles.add(new GameTile(10, 10)); 
     gameTiles.add(new GameTile(50, 10)); 

    } 

    public void paintComponent(Graphics g) { 

     for(int i = 0; i < gameTiles.size(); i++) { 
      gameTiles.get(i).draw(g); 
     } 

    } 

} 

에 그리고 내부에 유사합니다. paintComponent의 이름을 draw 또는 다른 이름으로 바꿉니다.

+0

어떻게 할 것인가를 확인하기 위해 코드를 구현하고 있지만, (gameTiles.get (i) .draw (g);) 행에는 gameTiles 클래스에 대한 그리기 메서드가없는 오류가 있습니다. 이런 멍청한 것에 대해 사과드립니다. 그러나 GUI는 정말로 혼란 스럽습니다. – SkillaPop

+0

GameTile 클래스의 paintComponent 메소드를 draw (Graphics g)로 대체해야합니다. 원하는대로 메소드를 호출하고, 페인트하고, 렌더링하고, 그립니다. – Squiddie

+0

이것은 내가 현재 가지고있는 것입니다 (그리고 내가 본 의견이나 게시물에서 코드를 형식화하는 방법을 알지 못해 죄송합니다.) \t [[void draw (Graphics g) { \t \t (int i = 0; i SkillaPop

1

그러나, 아무리 내가 무엇을하려고 타일은 너무 멀리 떨어져 공간이없고, 내가

GridLayout에서 구성 요소에 사용할 수있는 공간을 채우기 위해 각 셀을 확장 창을 크기를 조정할 때 모양을 변경합니다. 두 개의 셀만있는 경우 각 셀은 프레임 너비의 절반을 차지합니다.

그래서 해결책은 타일 패널을 원하는 패널 크기에 맞게 다른 패널로 래핑하는 것입니다. 따라서, 프레임의 레이아웃을 설정 타일을 들고 패널의 레이아웃을 설정하지 : 위의 코드는 타일이 프레임을 중심으로되게합니다

JPanel tilePanel = new JPane(new GridLayout(0, 2, 5, 5)); 
tilePanel.add(new GameTile(...)); 
tilePanel.add(new GameTile(...)); 

JPanel wrapper = new JPanel(new GridBagLayout()); 
wrapper.add(tilePanel, new GridBagConstraints()); 

frame.add(wrapper, BorderLayout.CENTER); 

: 같은

뭔가.

frame.add(wrapper, BorderLayout.LINE_END); 

위의 그림은 타일이 프레임의 오른쪽 중앙에 세로로 표시됩니다.