2015-09-08 2 views
1

Привет, Я делаю игру на Java, которая случайным образом генерирует 100 номеров, а затем попросите пользователя запомнить столько, сколько сможете, а затем попытаться вызвать столько, сколько сможете. В моей игре используется JPanel и объект Graphics g для выполнения всего чертежа. Как мне «нарисовать» поле JText или заставить его работать на jpanel?Получение ввода текста без качания в Java

+0

Почему бы просто не использовать 'JTextField' и просто добавить его в контейнер по вашему выбору? Возможно, вам стоит взглянуть на [Как использовать текстовые поля] (http://docs.oracle.com/javase/tutorial/uiswing/components/textfield.html) и [Укладка компонентов в контейнере] (http://docs.oracle.com/javase/tutorial/uiswing/layout/index.html) – MadProgrammer

ответ

3

Добавить ActionListener в JTextField, а затем добавить этот JTextField в JPanel. Теперь добавьте этот JPanel в JFrame, используя this.add(jpnel, BorderLayout.SOUTH); Создайте новый класс класса JPanel, в котором вы рисуете вещи. Добавьте JPanel в JFrame as, this.add(new Board(), BorderLayout.CENTER);. Здесь я закодировал один пример для вас. Теперь вы должны иметь представление о том, как это сделать ...

класс Board

public class Board extends JPanel { 

    int[] numbers = {3, 25, 5, 6, 60, 100}; 
    int index = 0; 
    static String num; 
    boolean once = true; 
    FontMetrics fm; 

    Board() { 
     setPreferredSize(new Dimension(400, 200)); 
     setBackground(Color.decode("#ffde00")); 
    } 

    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 
     Graphics2D g2 = (Graphics2D) g; 
     if (index < 6) { 
      num = numbers[index] + ""; 
     } else { 
      num = "Game Ended."; 
      Window.ans.setEditable(false); 
     } 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     g2.setFont(new Font("Arial", Font.PLAIN, 50)); 
     if(once){ 
      fm = g2.getFontMetrics(); 
      once = false; 
     } 
     int x = ((getWidth() - fm.stringWidth(num))/2); 
     int y = ((getHeight() - fm.getHeight())/2) + fm.getAscent(); 
     g2.drawString(num + "", x, y); 
     index++; 
    } 

} 

класс Window

public class Window extends JFrame { 

    JPanel p = new JPanel(); 
    JLabel lbl = new JLabel("Enter the number if you have seen it before, Else empty."); 
    JLabel res = new JLabel("...."); 
    static JTextField ans = new JTextField(10); 
    Board board = new Board(); 

    public Window() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     add(board, BorderLayout.CENTER); 
     p.setLayout(new BorderLayout(8, 8)); 
     p.add(lbl, BorderLayout.WEST); 
     ans.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
       if (ans.getText().equals(Board.num)) { 
        res.setText("Good"); 
       } else { 
        res.setText("Bad"); 
       } 
       ans.setText(""); 
       board.repaint(); 
      } 

     }); 
     p.add(ans, BorderLayout.CENTER); 
     p.add(res, BorderLayout.EAST); 
     p.setBorder(new EmptyBorder(10, 10, 10, 10)); 
     this.add(p, BorderLayout.SOUTH); 
     setResizable(false); 
     pack(); 
     setVisible(true); 
    } 

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

} 
+2

Почему вы добавляете 'KeyListener' в' JTextField'? Для этого нужен 'DocumentListener'. Кроме того, если вы только слушаете ENTER, вы можете добавить «ActionListener» в 'JTextField', который запускается при каждом нажатии ENTER. – Robin

+0

Он мог бы просто использовать jtf.getText(); – RamanSB

+0

@RamanSB Он генерирует случайные числа. – CodeRunner

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