【问题标题】: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 中输出错误消息“该单词不在字典中”(翻译)

【问题讨论】:

    标签: java arrays swing textarea equals


    【解决方案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。在我想出这个想法之前,它正在尝试其他东西;)
    猜你喜欢
    • 2016-03-10
    • 2017-07-17
    • 2012-07-22
    • 2011-10-17
    • 2018-11-16
    • 2021-07-30
    • 1970-01-01
    • 2023-04-02
    • 2013-02-08
    相关资源
    最近更新 更多