如何使用JTextArea并附加

时间:2015-05-06 23:51:29

标签: java swing append jtextarea

请帮助。当我运行这个GUI时,数字会从帧中运行。我知道我必须使用JTextArea并附加但我在哪里把它放在我的代码中。有人可以用简单的语言向我解释并告诉我吗?我想让它垂直和水平滚动,当我添加JTextArea我得到这个错误:错误:找不到符号panel.setMessage(消息);

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;
                }}}

1 个答案:

答案 0 :(得分: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());
    }
}

有时,您需要重新考虑您的设计,以支持您想要实现的目标。

验证和计算素数的过程应该做到这一点,他们不应该做任何其他事情(比如更新屏幕),这样你就可以解耦代码并以不同的方式重复使用它们。 ; t原始想到(比如输出到文件或网页)

有关详细信息,请参阅How to Use Text AreasHow to Use Scroll Panes