2014-02-13 2 views
1

Я относительно новичок в Java. У меня есть опыт работы с логической стороной программирования, но не с графическим интерфейсом. Я создал генератор CrossWord, который принимает текстовый файл со словами и определениями и делает кроссворд. В настоящее время у меня есть решение, хранящееся в 2d массиве char (s). Мне нужно выяснить, как отобразить кроссворд и проверить вход пользователя против решения. Мне было интересно, что «самый простой» способ показать это с помощью качания или каких-то графических компонентов. Я думал об использовании TilePane и текстовых полей, но я настолько совершенно новичок в GUI, что понятия не имею, как его кодировать. В предлагаемом решении, пожалуйста, предоставьте примерный код того, как это сделать.Каков наилучший способ создания графического интерфейса для кроссворда? java

Большое вам спасибо за ваш ввод.

ответ

1

Всегда есть много вариантов, когда речь заходит о графических интерфейсах. И вряд ли можно попросить решение наилучшим образом. Один, с одной стороны, потому что не может быть «лучшего» решения. С другой стороны, для того, чтобы выяснить, насколько «хорошо» решение (или является ли оно «лучшим»), нужно быть нелепо точным в отношении спецификации требований и метрики оценки.

Однако в одной из самых простых форм требование иметь компонент GUI, который может отображать массив char [] [] (и позволяет получать отображаемое в настоящее время содержимое в виде массива char [] []), может быть реализованы следующим образом:

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

СПАСИБО ВАС ТАК, ТАК, ТАК, ТАК МНОГО !!! Это действительно помогло. Я понял, как добавить его в свой ранее существующий графический интерфейс, и я смог закончить свою программу благодаря вам! – user3306101

Смежные вопросы