检查 JtextField 是不是不等于保存的数组

Posted

技术标签:

【中文标题】检查 JtextField 是不是不等于保存的数组【英文标题】:Checking to see if a JtextField is NOT equal to saved arrays检查 JtextField 是否不等于保存的数组 【发布时间】:2014-09-27 16:05:31 【问题描述】:

大家好,我是 Java 新手,从 7 月开始介绍 Java 课程。

我目前正在做一个带有数组的翻译器项目。主小程序显示 10 个英文单词,当输入 JTextField 时会输出该作品的西班牙语翻译。反之亦然。该程序还会显示与该单词相关的图片。

程序在这种情况下全部完成,我目前唯一缺少的部分是,如果用户输入除 20 个给定单词(10 个西班牙语和 10 个英语)之外的任何其他单词,则应该显示翻译的 JTextArea显示“该词不在字典中”。

我在创建显示此错误消息的 ELSE 语句时遇到问题。这是完整的代码。我不知道该怎么做才能做到这一点,例如

if (textFieldWord.!equals(englishWords[english]))
translate.setText("That word is not in the Dictionary");

这里是完整的代码 - - - -

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

public class DictionaryArrays extends JApplet implements ActionListener
String[] spanishWords =   "biblioteca","reloj",
"alarma", "volcan", "ventana", 
"autobus", "raton", "lago", "vaca", "encendedor";
String[] englishWords =  "library", "clock", "alarm", 
"volcano",  "window", "bus", "rat",
"lake","cow","lighter";
String textFieldWord;
Image[] photos;
ImageIcon icon;
ImageIcon icontwo;
JButton getTranslation;
JTextField entry; 
JLabel imageviewer;
TextArea translate;     
static int defaultX = 10;
static int defaultY = 10;
static int defaultW = 780;
static int defaultH = 50;

public void init() 

  photos = new Image[10];
  photos[0] = getImage(getCodeBase(), "library.jpg");
  photos[1] = getImage(getCodeBase(), "clock.jpg");
  photos[2] = getImage(getCodeBase(), "alarm.jpg");
  photos[3] = getImage(getCodeBase(), "volcano.jpg");
  photos[4] = getImage(getCodeBase(), "window.jpg");
  photos[5] = getImage(getCodeBase(), "bus.jpg");
  photos[6] = getImage(getCodeBase(), "rat.jpg");
  photos[7] = getImage(getCodeBase(), "lake.jpg");
  photos[8] = getImage(getCodeBase(), "cow.jpg");
  photos[9] = getImage(getCodeBase(), "lighter.jpg");
  final JPanel outer = new JPanel(new BorderLayout());
  JPanel inner = new JPanel(new BorderLayout());
  JPanel viewer = new JPanel(new BorderLayout());
  JPanel visualviewer = new JPanel(new BorderLayout());
  // here is the main component we want to see
  // when the outer panel is added to the null layout
  //JButton toSpanish = new JButton("English to Spanish");
  //JButton toEnglish = new JButton("Spanish to English");
  final JLabel list = new JLabel("<html><FONT COLOR=RED>English</FONT> - library, clock, alarm, volcano, window, bus, rat, lake, cow, lighter"
    +"<BR><FONT COLOR=RED>Spanish</FONT> - biblioteca, reloj, alarma, volcan, ventana, autobus, raton, lago, vaca, encendedor<BR>");
  translate = new TextArea("Your translation will show here");
  imageviewer = new JLabel(icon);
  viewer.add("West",translate);
  visualviewer.add("East",imageviewer);
  inner.add("Center",list);     
  //inner.add("West",toSpanish);
  //inner.add("East", toEnglish);
  outer.add("Center", inner);
  JPanel c = (JPanel)getContentPane();
  final JPanel nullLayoutPanel = new JPanel();
  nullLayoutPanel.setLayout(null);
  c.add("Center", nullLayoutPanel);
  // set the bounds of the panels manually
  nullLayoutPanel.add(outer);
  nullLayoutPanel.add(viewer);
  nullLayoutPanel.add(visualviewer);
  outer.setBounds(defaultX, defaultY, defaultW, defaultH);
  viewer.setBounds(20, 75, 300, 300);
  visualviewer.setBounds(485, 75, 300, 300);
  JPanel controlPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 10));
  entry = new JTextField("Enter English or Spanish word to translate here");
  entry.addActionListener(this);
  entry.addMouseListener(new MouseAdapter()
        @Override
        public void mouseClicked(MouseEvent e)
            entry.setText("");
            );
  getTranslation = new JButton("Translate");
  getTranslation.addActionListener(this);
  controlPanel.add(entry);
  controlPanel.add(getTranslation);
  c.add("South", controlPanel);
  viewer.setBackground(Color.blue);
  controlPanel.setBackground(Color.red);
  inner.setBackground(Color.yellow);
  visualviewer.setBackground(Color.black);
  outer.setBackground(Color.black);
  

public void paint(Graphics g) 
    super.paint(g);




    public void actionPerformed (ActionEvent ae)
        if(ae.getSource()==getTranslation)
            textFieldWord=(entry.getText().toLowerCase());

            for (int english = 0; english < spanishWords.length; english++)
                if (textFieldWord.equals(englishWords[english]))
                translate.setText(spanishWords[english]);
                icon= new ImageIcon(photos[english]);
                imageviewer.setIcon(icon);
                break;
                
                
            for (int spanish = 0; spanish < englishWords.length; spanish++)
                if (textFieldWord.equals(spanishWords[spanish]))
                translate.setText(englishWords[spanish]);
                icontwo= new ImageIcon(photos[spanish]);
                imageviewer.setIcon(icontwo);
                break;
                
                   


    
 

任何帮助将不胜感激。如果顶部段落是 TLDR。我试图让它在JTextField(条目)中输入除 10 个英语和 10 个西班牙语单词之外的任何其他单词,将在 TextArea 中输出错误消息“该单词不在字典中”(翻译)

【问题讨论】:

【参考方案1】:

这(显然)是错误的……

if (textFieldWord.!equals(englishWords[english]))

应该是……

if (!textFieldWord.equals(englishWords[english]))

试着这样想,String#equals 返回一个boolean,你想反转这个方法调用的结果,就和使用类似...

boolean doesEqual = textFieldWord.equals(englishWords[english]);
if (!doesEqual) ...

您需要评估方法调用的结果,但要进行该调用,语法必须是[object].[method],因此,为了反转值,您必须先完成方法调用,然后应用修改它...! ([object].[method])

更新...

说了这么多,让我们换个角度来看问题……

你需要找到一个匹配的词,为了做到这一点,你必须,在更坏的情况下,搜索整个数组。在您搜索整个数组之前,您不知道是否存在匹配项。

这意味着我们可以使用单独的if-else 语句来管理输出的更新,例如...

String translatedWord = null;
int foundIndex = -1;
for (int english = 0; english < spanishWords.length; english++)
    if (textFieldWord.equals(englishWords[english]))
        translatedWord = englishWords[english];
        foundIndex = english;
        break;
    


if (translatedWord != null) 
    translate.setText(translatedWord);
    icon= new ImageIcon(photos[foundIndex]);
    imageviewer.setIcon(icon);
 else 
    translate.setText("That word is not in the Dictionary");


translatedWord = null;
for (int spanish = 0; spanish < englishWords.length; spanish++)
    if (textFieldWord.equals(spanishWords[spanish]))
        translatedWord = englishWords[english];
        foundIndex = spanish;
        break;
    
   

if (translatedWord != null) 
    translate.setText(translatedWord);
    icontwo= new ImageIcon(photos[foundIndex]);
    imageviewer.setIcon(icontwo);
 else 
    translate.setText("That word is not in the Dictionary");

基本上,当它在任一数组中找到匹配项时,将translatedWord 设置为非null 值。在此,您要显示结果,否则您要显示错误消息...

同样,您可以将当前方法与上述方法合并,因此当您找到工作时,更新输出,同时检查translatedWord 变量的状态,如果是null,则显示错误消息。 ..

String translatedWord = null;
for (int english = 0; english < spanishWords.length; english++)
    if (textFieldWord.equals(englishWords[english]))
        translatedWord = spanishWords[english];
        translate.setText(translatedWord);
        icon= new ImageIcon(photos[english]);
        imageviewer.setIcon(icon);
        break;
    


if (translatedWord == null) 
    translate.setText("That word is not in the Dictionary");


translatedWord = null;
for (int spanish = 0; spanish < englishWords.length; spanish++)
    if (textFieldWord.equals(spanishWords[spanish]))
        translatedWord = englishWords[spanish];
        translate.setText(translatedWord);
        icontwo= new ImageIcon(photos[spanish]);
        imageviewer.setIcon(icontwo);
        break;
    
   

if (translatedWord == null) 
    translate.setText("That word is not in the Dictionary");

更新

好的,你有一个逻辑问题。您永远无法确定要翻译的方向。

如果将作品从西班牙语翻译成英文,以下内容基本上会改变以下内容

public void actionPerformed(ActionEvent ae) 
    if (ae.getSource() == getTranslation) 
        textFieldWord = (entry.getText().toLowerCase());

        translate.setText(null);

        String translatedWord = null;
        for (int english = 0; english < spanishWords.length; english++) 
            if (textFieldWord.equals(englishWords[english])) 
                translatedWord = spanishWords[english];
                translate.append(translatedWord + "\n");
                icon = new ImageIcon(photos[english]);
                imageviewer.setIcon(icon);
                break;
            
        

        if (translatedWord == null) 

            for (int spanish = 0; spanish < englishWords.length; spanish++) 
                if (textFieldWord.equals(spanishWords[spanish])) 
                    translatedWord = englishWords[spanish];
                    translate.append(translatedWord + "\n");
                icontwo = new ImageIcon(photos[spanish]);
                    imageviewer.setIcon(icontwo);
                    break;
                
            

        

        if (translatedWord == null) 
            translate.append("A Spanish-English match is not in the Dictionary\n");
        
    

现在,我建议您将 TextArea 替换为 JTextArea,但您需要将其包装在 JScrollPane

translate = new JTextArea("Your translation will show here");
viewer.add("West", new JScrollPane(translate));

避免使用null 布局,像素完美的布局是现代 UI 设计中的一种错觉。影响组件单个尺寸的因素太多,您无法控制。 Swing 旨在与核心的布局管理器一起工作,丢弃这些将导致无穷无尽的问题和问题,您将花费越来越多的时间来尝试纠正

基本上,由于这个原因,尝试和使用这真的很痛苦......

【讨论】:

啊,我想错了。我创建了一个 if 语句来在第二个 for 循环中创建它。这是另一个即将出现的问题。在该代码之后,如果我输入一个不在 20 个单词列表中的单词,它会显示“Word not in Dictionary”,但是当该消息显示我输入的单词是 20 个单词之一时,图像更改,但错误 TextArea 没有,并且一直说“单词不在字典中”。这会用 repaint() 解决吗? ? 啊,问题是……如果“english”不是null,那么“spanish”就会是,导致错误信息,给我一秒……跨度> 啊,这个方法成功了。 TextArea 是否只是让它不值得附加?我也意识到关于 nulllayout 问题,我需要更多地练习 GUI 设计和布局管理器。 TextArea 是一个重量级组件,与 Swing 的轻量级组件混合使用时会出现问题。 JTextArea 确实提供 setText 以及 append。在我想出这个想法之前,它正在尝试其他东西;)

以上是关于检查 JtextField 是不是不等于保存的数组的主要内容,如果未能解决你的问题,请参考以下文章

通过 JTextField 循环到 getText 并检查是不是为空

检查数组中两个不同数字的总和是不是等于变量数?

有条件地检查数组是不是等于特定值[重复]

在Python中检查二维数组中的所有元素是不是等于1 [重复]

如何从 JTextField 获取字符串并将其保存在变量中的更新?

Android 应用程序 - 检查用户的当前位置是不是等于(字符串)地址