我想创建一个用户需要输入句子的案例。
代码应验证句子是否为:
- 一个班格拉姆
- 不是一个完整的pangram
- 不是pangram
在文本区域:系统应该显示句子是哪个选项。
附件中是 JFrame 外观的屏幕截图。
有人可以帮我解决这个问题吗?
我继续创建了以下 GUI。
GUI 由一个JFrame
和一个主组成JPanel
。使用JPanel
aGridBagLayout
并由 a JLabel
, JTextArea
, JLabel
,组成JTextArea
。
GUI 使用DocumentListener处理输入的句子。中的代码DocumentListener
很简单,因为我在一个单独的类中处理句子。
这是我输入几个字符后的图形用户界面。
还有几个字符
最终结果
当我创建 Swing GUI 时,我使用模型/视图/控制器(MVC) 模式。这种模式使我能够分离我的关注点并一次专注于应用程序的一个部分。
我创建了一个模型类、一个视图类和一个控制器类。模型类为任何输入语句PangramModel
生成结果。视图类创建 GUI。控制器类更新结果。String
String
PangramGUI
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, 5));
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.LINE_START;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.insets = new Insets(5, 5, 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;
}
}
}