问题描述
代码应该验证句子是否为:
在文本区域:系统应显示该句子是哪个选项。
附件中 JFrame 外观的屏幕截图。
有人可以帮助我如何实施吗?
解决方法
简介
我继续创建了以下 GUI。
GUI 由一个 JFrame
和一个主 JPanel
组成。 JPanel
使用 GridBagLayout
并由 JLabel
、JTextArea
、JLabel
、JTextArea
组成。
GUI 在使用 DocumentListener 键入时处理句子。 DocumentListener
中的代码很简单,因为我在单独的类中处理句子。
这是我输入几个字符后的 GUI。
还有几个字符
最终结果
说明
当我创建 Swing GUI 时,我使用 model / view / controller (MVC) 模式。这种模式使我能够将我的关注点分开,并一次专注于应用程序的一个部分。
我创建了一个模型类、一个视图类和一个控制器类。 PangramModel
模型类为任何输入句子 String
生成结果 String
。 PangramGUI
视图类创建 GUI。 SentenceDocumentListener
控制器类更新结果 JTextArea
。
最复杂的代码可以在模型类中找到。处理句子 String
的方法可能有很多种。这就是我编码的方式。
代码
这是完整的可运行代码。我将类设为内部类,这样我就可以将此代码作为一个块发布。
import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.util.ArrayList;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
public class PangramGUI implements Runnable {
public static void main(String[] args) {
SwingUtilities.invokeLater(new PangramGUI());
}
private JTextArea sentenceArea;
private JTextArea resultArea;
@Override
public void run() {
JFrame frame = new JFrame("Pangram Analysis");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(createMainPanel(),BorderLayout.CENTER);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
private JPanel createMainPanel() {
JPanel panel = new JPanel(new GridBagLayout());
panel.setBorder(BorderFactory.createEmptyBorder(5,5,5));
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.LINE_START;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.insets = new Insets(5,5);
gbc.weightx = 1.0;
gbc.gridwidth = 1;
gbc.gridx = 0;
gbc.gridy = 0;
JLabel label = new JLabel("Type the sentence to analyze");
panel.add(label,gbc);
gbc.gridy++;
sentenceArea = new JTextArea(3,40);
sentenceArea.setLineWrap(true);
sentenceArea.setWrapStyleWord(true);
sentenceArea.getDocument().addDocumentListener(
new SentenceDocumentListener());
panel.add(sentenceArea,gbc);
gbc.gridy++;
label = new JLabel("Pangram result");
panel.add(label,gbc);
gbc.gridy++;
resultArea = new JTextArea(4,40);
resultArea.setEditable(false);
resultArea.setLineWrap(true);
resultArea.setWrapStyleWord(true);
panel.add(resultArea,gbc);
return panel;
}
public class SentenceDocumentListener implements DocumentListener {
private PangramModel model;
public SentenceDocumentListener() {
this.model = new PangramModel();
}
@Override
public void insertUpdate(DocumentEvent event) {
processSentence(sentenceArea.getText());
}
@Override
public void removeUpdate(DocumentEvent event) {
processSentence(sentenceArea.getText());
}
@Override
public void changedUpdate(DocumentEvent event) {
processSentence(sentenceArea.getText());
}
private void processSentence(String text) {
String result = model.processSentence(text);
resultArea.setText(result);
}
}
public class PangramModel {
private String alphabet;
public PangramModel() {
this.alphabet = "abcdefghijklmnopqrstuvwxyz";
}
public String processSentence(String sentence) {
int[] count = new int[alphabet.length()];
for (int index = 0; index < sentence.length(); index++) {
char c = Character.toLowerCase(sentence.charAt(index));
int charIndex = alphabet.indexOf(c);
if (charIndex >= 0) {
count[charIndex]++;
}
}
if (isEmpty(count)) {
return "Not a pangram";
} else {
List<Character> missingCharacters = getUnusedCharacters(count);
if (missingCharacters.size() <= 0) {
return "A pangram";
} else {
StringBuilder builder = new StringBuilder();
builder.append("Not a complete pangram");
builder.append(System.lineSeparator());
builder.append(System.lineSeparator());
builder.append("Missing characters: ");
for (int index = 0; index < missingCharacters.size(); index++) {
builder.append(missingCharacters.get(index));
if (index < (missingCharacters.size() - 1)) {
builder.append(",");
}
}
return builder.toString();
}
}
}
private boolean isEmpty(int[] count) {
for (int index = 0; index < count.length; index++) {
if (count[index] > 0) {
return false;
}
}
return true;
}
private List<Character> getUnusedCharacters(int[] count) {
List<Character> output = new ArrayList<>();
for (int index = 0; index < count.length; index++) {
if (count[index] <= 0) {
output.add(alphabet.charAt(index));
}
}
return output;
}
}
}