输出问题,在我通过void函数(Caesar's Cipher,Java,swing)后用户的输入

输出问题,在我通过void函数(Caesar's Cipher,Java,swing)后用户的输入,java,swing,Java,Swing,我最近几周在学习java和菜鸟。我正在尝试编写一个程序,类似于凯撒密码,用我自己的方式,当然不是最有效的算法,在当前字母后将字母更改2个位置。我正试图借助swing解决这个问题 当我在没有GUI的情况下测试eclipse时,一切都正常工作,例如: 输入:我在这里输出:k co jgtg 但由于我是通过GUI运行它的,因此在代码末尾执行的操作中出现了错误: outputField.SetTextEnCryptInputField.getText 错误消息:类型JTextComponent中的方法s

我最近几周在学习java和菜鸟。我正在尝试编写一个程序,类似于凯撒密码,用我自己的方式,当然不是最有效的算法,在当前字母后将字母更改2个位置。我正试图借助swing解决这个问题

当我在没有GUI的情况下测试eclipse时,一切都正常工作,例如:

输入:我在这里输出:k co jgtg

但由于我是通过GUI运行它的,因此在代码末尾执行的操作中出现了错误: outputField.SetTextEnCryptInputField.getText

错误消息:类型JTextComponent中的方法setText不适用于参数void

我相信问题来自我的方法encryptedInput及其返回值。我知道作为一个void什么也不返回,但我觉得system.out.println不知何故它不适合我的outputField/ActionListener部分

我检查了许多主题,但不幸的是,没有什么有用的。或者至少,我有限的编程经验不能帮助我从这些主题中识别出可能的解决方案

我希望有人能帮助我

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/* Caesar's Cipher function - 2 positions (indexes) after. */
public class CaesarCipher extends JFrame implements ActionListener{

    JLabel inputLabel, outputLabel;
    JButton calculatebtn;
    JTextField inputField, outputField;
    GridLayout grid;
    String encryptedString;

    public CaesarCipher()
    {
        setTitle("Caesar Cipher Converter");        
        setSize(350,200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        inputLabel = new JLabel("Put your Text here : ");
        inputField = new JTextField(20);
        outputLabel = new JLabel("Result : "); 
        outputField = new JTextField(20);
        calculatebtn = new JButton("Convert");

        grid = new GridLayout(5,1);
        JPanel pane = new JPanel();
        pane.setLayout(grid);
        setContentPane(pane);

        pane.add(inputLabel);
        pane.add(inputField);
        pane.add(calculatebtn);
        pane.add(outputLabel);
        pane.add(outputField);

        calculatebtn.addActionListener(this);
    }



    public static void main(String[] args) {

        CaesarCipher caeCipher = new CaesarCipher();
        caeCipher.setVisible(true);
    }

    public void encryptInput(String inputString)
    {
        /* Array to calculate the new values (a-z)*/
        char[] caesArray = {'a', 'b', 'c','d','e','f','g','h',
                'i','j','k','l','m','n','o','p','q','r','s','t',
                'u','v','w','x','y','z', ' ', '.'};

        /* Array for users input */
        char[] inputArray = new char[inputString.length()];
        char resultChar= ' ';

        /* saves the String characters into the inputArray */
        for(int i = 0 ; i < inputArray.length; i++)
        {
            inputArray[i] = inputString.charAt(i);
        }

        for(int i = 0 ; i < inputArray.length ; i++)
            for(int j = 0 ; j < caesArray.length ; j++)
            {

                 if (caesArray[j] == inputArray[i])
                 {
                     /* My special characters */
                     switch(inputArray[i])
                    {
                    case ' ': resultChar = ' ';
                    break;
                    case '.': resultChar = '.';
                    break;
                    }

                    if(inputArray[i] == caesArray[caesArray.length - 1])
                    {
                        inputArray[i] = caesArray[1];
                    }
                    else if(inputArray[i] == caesArray[caesArray.length - 2])
                    {
                        inputArray[i] = caesArray[0];                       
                    }
                    else
                    {
                        resultChar = caesArray[j+2];
                    }
                     System.out.print(resultChar);
                 } 
            }

    }

    @Override
    public void actionPerformed(ActionEvent arg0)
    {

            if(arg0.getSource() == calculatebtn)
            {
                outputField.setText(encryptInput(inputField.getText()));
            }
    }

}

所以问题是,您的encryptInput方法不返回任何内容,或者更确切地说,它返回一个大致相同的void。因此,您应该稍微更改代码,并将返回数据类型更改为string

也有一个黑客的方式,但如果你想你可以试试。 您可以为类创建一个私有字符串变量。运行encryptInput方法并将私有变量设置为该方法的结果。之后,可以将私有变量设置为字段的文本

这可能看起来像:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/* Caesar's Cipher function - 2 positions (indexes) after. */
public class CaesarCipher extends JFrame implements ActionListener{

JLabel inputLabel, outputLabel;
JButton calculatebtn;
JTextField inputField, outputField;
GridLayout grid;
String encryptedString;
// ADD THIS VARIABLE
privage String encryptedMessage = "";
//
public CaesarCipher()
{
    setTitle("Caesar Cipher Converter");        
    setSize(350,200);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    inputLabel = new JLabel("Put your Text here : ");
    inputField = new JTextField(20);
    outputLabel = new JLabel("Result : "); 
    outputField = new JTextField(20);
    calculatebtn = new JButton("Convert");

    grid = new GridLayout(5,1);
    JPanel pane = new JPanel();
    pane.setLayout(grid);
    setContentPane(pane);

    pane.add(inputLabel);
    pane.add(inputField);
    pane.add(calculatebtn);
    pane.add(outputLabel);
    pane.add(outputField);

    calculatebtn.addActionListener(this);
}



public static void main(String[] args) {

    CaesarCipher caeCipher = new CaesarCipher();
    caeCipher.setVisible(true);
}

public void encryptInput(String inputString)
{
   this.encryptedMessage = "";
    /* Array to calculate the new values (a-z)*/
    char[] caesArray = {'a', 'b', 'c','d','e','f','g','h',
            'i','j','k','l','m','n','o','p','q','r','s','t',
            'u','v','w','x','y','z', ' ', '.'};

    /* Array for users input */
    char[] inputArray = new char[inputString.length()];
    char resultChar= ' ';

    /* saves the String characters into the inputArray */
    for(int i = 0 ; i < inputArray.length; i++)
    {
        inputArray[i] = inputString.charAt(i);
    }

    for(int i = 0 ; i < inputArray.length ; i++)
        for(int j = 0 ; j < caesArray.length ; j++)
        {

             if (caesArray[j] == inputArray[i])
             {
                 /* My special characters */
                 switch(inputArray[i])
                {
                case ' ': resultChar = ' ';
                break;
                case '.': resultChar = '.';
                break;
                }

                if(inputArray[i] == caesArray[caesArray.length - 1])
                {
                    inputArray[i] = caesArray[1];
                }
                else if(inputArray[i] == caesArray[caesArray.length - 2])
                {
                    inputArray[i] = caesArray[0];                       
                }
                else
                {
                    resultChar = caesArray[j+2];
                }
                 this.encryptedMessage += resultChar;
             } 
        }

}

@Override
public void actionPerformed(ActionEvent arg0)
{

        if(arg0.getSource() == calculatebtn)
        {
            outputField.setText(encryptInput(inputField.getText()));
        }
}
}这是因为:

您的方法encryptInput不返回任何返回类型为void的内容 setText方法接受字符串作为参数 在encryptInput结束时,您的方法只是在每次计算时将resultChar打印到标准输出。您需要对其进行更改,以便返回一个字符串,该字符串包含正在显示的所有resultChars的串联

有很多方法可以做到这一点,这里有一个简单的例子,只使用您似乎知道的工具:

public String encryptInput(String inputString)
{
    /* Array to calculate the new values (a-z)*/
    char[] caesArray = {'a', 'b', 'c','d','e','f','g','h',
            'i','j','k','l','m','n','o','p','q','r','s','t',
            'u','v','w','x','y','z', ' ', '.'};

    /* Array for users input */
    char[] inputArray = new char[inputString.length()];
    char resultChar= ' ';
    char[] resultArray = new char[inputString.length()];

    /* saves the String characters into the inputArray */
    for(int i = 0 ; i < inputArray.length; i++)
    {
        inputArray[i] = inputString.charAt(i);
    }

    for(int i = 0 ; i < inputArray.length ; i++)
        for(int j = 0 ; j < caesArray.length ; j++)
        {

             if (caesArray[j] == inputArray[i])
             {
                 /* My special characters */
                 switch(inputArray[i])
                {
                case ' ': resultChar = ' ';
                break;
                case '.': resultChar = '.';
                break;
                }

                if(inputArray[i] == caesArray[caesArray.length - 1])
                {
                    inputArray[i] = caesArray[1];
                }
                else if(inputArray[i] == caesArray[caesArray.length - 2])
                {
                    inputArray[i] = caesArray[0];                       
                }
                else
                {
                    resultChar = caesArray[j+2];
                }
                 System.out.print(resultChar);
                 resultArray[i] = resultChar;
             } 
        }
    return new String(resultArray);
}

注:一般来说,这段代码肯定可以改进,但这超出了问题的范围:

欢迎您。既然这有助于你解决问题,你能把这个答案标记为接受吗?