输出问题,在我通过void函数(Caesar's Cipher,Java,swing)后用户的输入
我最近几周在学习java和菜鸟。我正在尝试编写一个程序,类似于凯撒密码,用我自己的方式,当然不是最有效的算法,在当前字母后将字母更改2个位置。我正试图借助swing解决这个问题 当我在没有GUI的情况下测试eclipse时,一切都正常工作,例如: 输入:我在这里输出:k co jgtg 但由于我是通过GUI运行它的,因此在代码末尾执行的操作中出现了错误: outputField.SetTextEnCryptInputField.getText 错误消息:类型JTextComponent中的方法setText不适用于参数void 我相信问题来自我的方法encryptedInput及其返回值。我知道作为一个void什么也不返回,但我觉得system.out.println不知何故它不适合我的outputField/ActionListener部分 我检查了许多主题,但不幸的是,没有什么有用的。或者至少,我有限的编程经验不能帮助我从这些主题中识别出可能的解决方案 我希望有人能帮助我输出问题,在我通过void函数(Caesar's Cipher,Java,swing)后用户的输入,java,swing,Java,Swing,我最近几周在学习java和菜鸟。我正在尝试编写一个程序,类似于凯撒密码,用我自己的方式,当然不是最有效的算法,在当前字母后将字母更改2个位置。我正试图借助swing解决这个问题 当我在没有GUI的情况下测试eclipse时,一切都正常工作,例如: 输入:我在这里输出:k co jgtg 但由于我是通过GUI运行它的,因此在代码末尾执行的操作中出现了错误: outputField.SetTextEnCryptInputField.getText 错误消息:类型JTextComponent中的方法s
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);
}
注:一般来说,这段代码肯定可以改进,但这超出了问题的范围:欢迎您。既然这有助于你解决问题,你能把这个答案标记为接受吗?