Проблема с выводом, пользовательский ввод после того, как я пропущу его через функцию void (Cesher Цезаря, Java, свинг) - PullRequest
0 голосов
/ 03 марта 2019

Я изучаю Java последние недели (и новичок).Я пытаюсь закодировать программу, похожую на «Цезарь Цезаря», по-своему (конечно, не самый эффективный алгоритм), меняя буквы на 2 позиции после «текущей» буквы.Я пытаюсь решить это с помощью свинга.

Когда я тестирую его (затмение) без графического интерфейса, все работает правильно, например:

input : «Я здесь».- output : "k co jgtg."

Но так как я запускаю его через графический интерфейс, я получаю error в actionPerformed вконец кода: "outputField. setText (encryptInput (inputField.getText ()));"

Сообщение об ошибке : Метод setText () в типе JTextComponent не применим для аргументов (void).

Я полагаю, что проблема связана с моим методом «encryptedInput» и его «возвращаемым» значением.Я знаю, что пустота ничего не возвращает, но я чувствую, что 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()));
            }
    }

}

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Это потому, что:

  • ваш метод encryptInput ничего не возвращает (тип возврата void)
  • , а метод setText принимает String какпараметр

В конце encryptInput ваш метод просто выводит resultChar на стандартный вывод каждый раз, когда вы его вычисляете.Вам нужно изменить его, чтобы он возвращал String, содержащий объединение всех отображаемых resultChar.

Есть много способов сделать это, вот простой пример, использующий только инструментывы, кажется, знаете:

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

PS: в общем, этот кусок кода определенно можно улучшить, но это выходит за рамки этого вопроса:)

0 голосов
/ 03 марта 2019

Так что проблема в том, что ваш метод encryptInput ничего не возвращает, или, скорее, он возвращает пустоту, которая более или менее одинакова.Поэтому вам следует немного изменить свой код и изменить тип возвращаемого типа на строку.

Существует также немного хакерский способ, но если вы хотите, вы можете попробовать это.Вы можете создать личную строковую переменную для класса.Запустите метод 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()));
        }
}

}

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