【问题标题】:How to use JTextArea and Append如何使用 JTextArea 和 Append
【发布时间】:2015-07-17 08:22:53
【问题描述】:

请帮忙。当我运行这个 GUI 时,数字会超出框架。我知道我必须使用 JTextArea 并追加,但我应该把它放在我的代码中的什么地方。有人可以简单地向我解释并告诉我吗?我想让它垂直和水平滚动,当我添加 JTextArea 时出现此错误:错误:找不到符号 panel.setMessage(message);

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

【问题讨论】:

  • 获取TextPane 中的功能,将其移动到它自己的类中。修改功能以返回代表“消息”的String,使用JTextArea#append(String)将计算结果附加到JTextArea

标签: java swing append jtextarea


【解决方案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 AreasHow to Use Scroll Panes 了解更多详情

【讨论】:

    猜你喜欢
    • 2015-01-04
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 2014-06-25
    • 1970-01-01
    相关资源
    最近更新 更多