2014-02-13 2 views
1

나는 비교적 새로운 자바입니다. 프로그래밍의 논리 측면에 대한 경험이 있지만 GUI에는 그다지 많은 경험이 없습니다. 크로스 워드 생성기를 만들었습니다. 크로스 워드 생성기는 단어와 정의가있는 텍스트 파일을 가져 와서 크로스 워드를 만듭니다. 현재 솔루션은 char (s)의 2 차원 배열에 저장되어 있습니다. 크로스 워드를 표시하고 솔루션에 대한 사용자 입력을 확인하는 방법을 알아야합니다. 스윙이나 일종의 그래픽 구성 요소를 사용하여 이것을 표시하는 "가장 쉬운"방법이 무엇인지 궁금 해서요. 나는 TilePane과 textboxes를 사용하려고 생각하고 있었지만 GUI에 완전히 익숙하지 않아서 어떻게 코딩해야하는지 전혀 모른다. 제안 된 솔루션에서 무엇이든지 만드는 방법에 대한 예제 코드를 제공하십시오.크로스 워드 퍼즐을위한 GUI를 만드는 가장 좋은 방법은 무엇입니까? 자바

입력 해 주셔서 대단히 감사드립니다. 이 GUI를에 관해서

답변

1

항상 많은 옵션이 있습니다. 그리고 솔루션을 요청하는 것은 거의 불가능합니다. 한 가지 방법은 "최상의"해결책이 없기 때문입니다. 반면에, 솔루션이 "좋은"방법 (또는 그것이 "최상의"방법인지)을 알아 내기 위해서는 요구 사항 및 평가 메트릭의 사양에 관해 엄청나게 정확해야합니다.

그러나 가장 간단한 형식 중 하나에서 char [] [] 배열을 표시하고 (현재 표시된 내용을 char [] [] 배열로 가져올 수있는) GUI 구성 요소가 필요합니다. 이 같은 구현 ...

import java.awt.BorderLayout; 
import java.awt.FlowLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Random; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 

public class CrosswordGUI 
{ 
    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       createAndShowGUI(); 
      } 
     }); 
    } 

    private static void createAndShowGUI() 
    { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     f.getContentPane().setLayout(new BorderLayout()); 

     JPanel container = new JPanel(new FlowLayout()); 
     final CrosswordPanel panel = new CrosswordPanel(); 
     container.add(panel); 
     f.getContentPane().add(container, BorderLayout.CENTER); 

     JButton generateButton = new JButton("Generate"); 
     generateButton.addActionListener(new ActionListener() 
     { 
      @Override 
      public void actionPerformed(ActionEvent e) 
      { 
       generate(panel); 
      } 
     }); 
     f.getContentPane().add(generateButton, BorderLayout.SOUTH); 

     f.setSize(800, 800); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    private static Random random = new Random(0); 
    private static void generate(CrosswordPanel panel) 
    { 
     int w = 4 + random.nextInt(8); 
     int h = 4 + random.nextInt(8); 
     char crossword[][] = new char[w][h]; 
     for (int y=0; y<h; y++) 
     { 
      for (int x=0; x<w; x++) 
      { 
       if (random.nextFloat() > 0.2) 
       { 
        char c = (char)('A' + random.nextInt(26)); 
        crossword[x][y] = c; 
       } 
      } 
     } 

     panel.setCrossword(crossword); 
    } 

} 


class CrosswordPanel extends JPanel 
{ 
    private JTextField textFields[][]; 

    void setCrossword(char array[][]) 
    { 
     removeAll(); 
     int w = array.length; 
     int h = array[0].length; 
     setLayout(new GridLayout(w, h)); 
     textFields = new JTextField[w][h]; 

     for (int y=0; y<h; y++) 
     { 
      for (int x=0; x<w; x++) 
      { 
       char c = array[x][y]; 
       if (c != 0) 
       { 
        textFields[x][y] = new JTextField(String.valueOf(c)); 
        textFields[x][y].setFont(textFields[x][y].getFont().deriveFont(20.0f)); 
        add(textFields[x][y]); 
       } 
       else 
       { 
        add(new JLabel()); 
       } 
      } 
     } 
     getParent().validate(); 
     repaint(); 
    } 

    char[][] getCrossword() 
    { 
     int w = textFields.length; 
     int h = textFields[0].length; 
     char crossword[][] = new char[w][h]; 
     for (int y=0; y<h; y++) 
     { 
      for (int x=0; x<w; x++) 
      { 
       if (textFields[x][y] != null) 
       { 
        String s = textFields[x][y].getText(); 
        if (s.length() > 0) 
        { 
         crossword[x][y] = s.charAt(0); 
        } 

       } 
      } 
     } 
     return crossword; 
    } 

} 
+0

그래서 너 정말 그렇게 많이 !!! 이것은 정말로 도움이되었습니다. 내 기존 GUI에 추가하는 방법을 알아 냈어. 너 덕분에 내 프로그램을 다 끝낼 수 있었어! – user3306101