2015-05-06 4 views
0

Пожалуйста, помогите. Когда я запускаю этот графический интерфейс, номера запускаются из фрейма. Я знаю, что мне нужно использовать JTextArea и добавлять, но где я помещаю это в свой код. может кто-нибудь объяснить мне простыми словами и показать мне? Я хочу, чтобы он прокручивался вертикально и горизонтально, и когда я добавляю JTextArea, я получаю эту ошибку: error: не удается найти символ panel.setMessage (message);Как использовать JTextArea и Append

import java.io.*; 
import java.util.*; 
import java.lang.*; 
import java.text.*; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class prime extends JFrame 
{ 
     public static void main(String[] args) 
     { 
     prime frame = new prime(); 
     } 

private JTextArea panel; 
     private JPanel inPanel; 
     private JTextField inField; 

     public prime() 
     { 
      final int width = 500; 
      final int height = 500; 
      setSize(width, height); 
      setTitle("Find Prime Numbers"); 

      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

      panel = new JTextArea(20, 10); 
add(new JScrollPane(panel), "Center"); 

      inPanel = new JPanel(); 
      inPanel.add(new JLabel("Enter Your Number", SwingConstants.RIGHT)); 
      inField = new JTextField(20); 
      ActionListener inListener = new TextListener(); 
      inField.addActionListener(inListener); 

      inPanel.add(inField); 
      add(inPanel, "South"); 

      setVisible(true); 
     } 

     private class TextListener implements ActionListener 
     { 
      public void actionPerformed(ActionEvent event) 
      { 
       String message = inField.getText(); 
       inField.setText(""); 
       panel.setMessage(message); 
      } 
     } 

    class TextPanel extends JPanel 
    { 
     private String message; 
     private Color backGroundColor; 

     public TextPanel() 
     { 
      message = ""; 
      backGroundColor = Color.white; 
     } 

     public TextPanel(String x, Color background) 
     { 
      message = x; 
      backGroundColor = background; 
     } 

     public void paintComponent(Graphics g) 
     { 
      super.paintComponent(g); 
      Graphics2D g2 = (Graphics2D)g; 
      int width = getWidth(); 
      int height = getHeight(); 
      setBackground(backGroundColor); 
      g2.setColor(Color.black); 
      Font x = new Font("TimesNewRoman", Font.BOLD,20); 
      g2.setFont(x); 
      FontMetrics fm = g2.getFontMetrics(x); 

      g2.drawString(message,50, 50); 
        if(!(message.equals(""))) 
        g2.drawString(previousPrime(message),50,78); 
     } 



     public void setMessage(String message) { 
         if (isPrime(Integer.parseInt(message))){ 
          this.message = message + " is a prime number."; 
         } 
         else 
          this.message = message + " is not a prime number."; 
      repaint(); 
        } 

       public boolean isPrime(int num){ 
        for(int i = 2; i < num; i++){ 
         if (num % i == 0) 
          return false; 
        } 
        if(num < 2) 
         return false; 

        return true; 
       } 

       public String previousPrime(String message){ 
        String totalPrimeNum = ""; 
        int finalNum = Integer.parseInt(message.substring(0,message.indexOf(" "))); 
        int count = 0; 
        for(int i = 2; i < finalNum; i++){ 
         if(isPrime(i)) { 
          totalPrimeNum += " " + i; 
          count++; 
         } 

         if(count == 10) { 
          totalPrimeNum += "\n"; 
          count = 0; 
         } 
        } 

        if (isPrime(Integer.parseInt(message.substring(0,message.indexOf(" "))))) 
         totalPrimeNum += " " + finalNum; 
        System.out.println(totalPrimeNum); 
        return totalPrimeNum; 
       }}} 
+0

Возьмите функциональность в 'TextPane', переместить его в его собственном классе. Измените функциональность, чтобы вернуть строку, представляющую «сообщение», использовать 'JTextArea # append (String)', чтобы добавить результат вычисления в 'JTextArea' – MadProgrammer

ответ

1

Посмотрите, что у вас есть и чего вы хотите достичь. У вас есть метод, который может проверить, является ли значение простым или нет, но оно не производит никакого вывода. У вас есть JTextArea, который позволяет вам добавлять к нему контент.

У вас есть квадратный колышек и круглое отверстие. Одна из этих вещей должна измениться. У вас есть контроль над методом setMessage, но у вас нет контроля над JTextArea, это может означать, что необходимо изменить setMessage. В то время как вы могли бы передать JTextArea методу setMessage, лучшим решением было бы изменить setMessage вернуть какой-то значимой ценности или просто избавиться от него в пользу использования метода isPrime вместо

Возьмите TestPane и двигаться функциональность используется для вычисления и тестирования для простого числа к новому классу, к примеру ...

public class PrimeCalculator { 

    public boolean isPrime(int num) { 
     for (int i = 2; i < num; i++) { 
      if (num % i == 0) { 
       return false; 
      } 
     } 
     if (num < 2) { 
      return false; 
     } 

     return true; 
    } 

    public String previousPrime(String message) { 
     StringBuilder totalPrimeNum = new StringBuilder(128); 
     int finalNum = Integer.parseInt(message.substring(0, message.indexOf(" "))); 
     int count = 0; 
     for (int i = 2; i < finalNum; i++) { 
      if (isPrime(i)) { 
       totalPrimeNum.append(" ").append(i); 
       count++; 
      } 

      if (count == 10) { 
       totalPrimeNum.append("\n"); 
       count = 0; 
      } 
     } 

     if (isPrime(Integer.parseInt(message.substring(0, message.indexOf(" "))))) { 
      totalPrimeNum.append(" ").append(finalNum); 
     } 
     System.out.println(totalPrimeNum); 
     return totalPrimeNum.toString(); 
    } 
} 

Теперь это не делает никаких предположений над тем, что вы хотите сделать, и просто производит вывод. Теперь вы можете использовать эти методы и принимать решения о том, как использовать выход, например ...

private class TextListener implements ActionListener { 

    @Override 
    public void actionPerformed(ActionEvent event) { 
     PrimeCalculator calc = new PrimeCalculator(); 
     String message = inField.getText(); 
     inField.setText(""); 
     String text = message + " is not a prime number\n"; 
     try { 
      if (calc.isPrime(Integer.parseInt(message))) { 
       text = message + " is a prime number\n"; 
      } 
     } catch (NumberFormatException exp) { 
      text = message + " is not a valid integer\n"; 
     } 
     panel.append(message); 
     panel.setCaretPosition(panel.getDocument().getLength()); 
    } 
} 

Иногда, вам нужно пересмотреть свой дизайн, чтобы поддержать то, что именно вы хотите достичь.

Процесс проверки и вычисления простых чисел должен делать именно это, они не должны делать ничего (например, обновлять экран), таким образом вы можете разделить код и повторно использовать его разными способами, т оригинальный думать о (как вывод в файл или в Интернете)

См How to Use Text Areas и How to Use Scroll Panes для получения более подробной информации

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