检查 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 [重复]