正如问题所述,我在更新JScrollPane内部的JTextArea文本时遇到了麻烦。
我能够从JScrollPane的类型化getView()中获取文本。 但是,我尝试了以下更新JTextArea。
((JTextArea)(chatWindow.getViewport().getView())).setText("Hello!");
其中chatWindow是JScrollPane。
我试过这个:
chatWindowInsert.setText(processMessage());
其中chatWindowInsert是JScrollPane中的JTextArea
不幸的是,这两项工作都没有。
我没有任何例外或悬挂。
将不胜感激!
这是我的完整代码。如果我打破了一百万个编程实践,请原谅我。
public class ChatterBotClient extends JFrame{
/**
*
*/
private static final long serialVersionUID = 1L;
private static ChatterBotFactory chatterBotFactory;
private static ChatterBotSession chatterBotSession;
private static ChatterBot chatterBot;
public static JScrollPane chatWindow;
public static JTextField userInput;
public static JTextArea chatWindowInsert;
public ChatterBotClient()
{
try{
chatterBotFactory = new ChatterBotFactory();
chatterBot = chatterBotFactory.create(ChatterBotType.CLEVERBOT);
chatterBotSession = chatterBot.createSession();
}catch(Exception e)
{
e.printStackTrace();
System.out.println("Error :O");
JOptionPane.showMessageDialog(null,
"There has been a problem initializing the Bot. Please restart.");
}
initUI();
}
public void initUI()
{
//Define the mainPanel that everything goes into in the JFrame
JPanel mainPanel = new JPanel(new BorderLayout());
//Define the child panels of "mainPanel"
JPanel infoPanel = new JPanel(new FlowLayout());
JPanel chatHistoryPanel = new JPanel(new FlowLayout());
JPanel userInputAndButtonPanel = new JPanel(new FlowLayout());
setTitle("ChatterBot Chat Client");
setSize(600,300);
setResizable(false);
//Define each component
//Set properties of each component
JLabel infoLabel = new JLabel("Welcome to my Cleverbot Client! Please enjoy! :D");
infoLabel.setPreferredSize(new Dimension(550, 20));
infoLabel.setHorizontalTextPosition(SwingConstants.CENTER);
chatWindowInsert = new JTextArea();
chatWindowInsert.setWrapStyleWord(true);
chatWindow = new JScrollPane(chatWindowInsert);
chatWindow.setPreferredSize(new Dimension(500,225));
chatWindow.setPreferredSize(chatWindow.getPreferredSize());
userInput = new JTextField();
userInput.setPreferredSize(new Dimension(250, 25));
JButton enterBtn = new JButton("Send");
enterBtn.setPreferredSize(new Dimension(75, 25));
//Add each component to the required panels
infoPanel.add(infoLabel);
chatHistoryPanel.add(chatWindow);
userInputAndButtonPanel.add(userInput, BorderLayout.CENTER);
userInputAndButtonPanel.add(enterBtn, BorderLayout.EAST);
//Add the child panels to the mainPanel
mainPanel.add(infoPanel, BorderLayout.NORTH);
mainPanel.add(chatHistoryPanel, BorderLayout.CENTER);
mainPanel.add(userInputAndButtonPanel, BorderLayout.SOUTH);
//Now, add the appropriate listeners to your components
enterBtn.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
System.out.println("You clicked me! :D");
try {
processMessage();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("Something went wrong when you pressed the button! :O");
}
}
});
userInput.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0)
{
chatWindow = new JScrollPane(new JTextArea(processMessage()));
}
});
//Tell the JFrame to display what we've made!
add(mainPanel);
}
public static String processMessage()
{
try {
String completeMessage = chatWindowInsert.getText();
completeMessage.concat("You: " + userInput.getText() + "\n");
String response = chatterBotSession.think(userInput.getText());
completeMessage.concat("Bot: " + response + "\n");
userInput.setText("");
return completeMessage;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return "ERROR";
}
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
ChatterBotClient cli = new ChatterBotClient();
cli.setVisible(true);
}
});
}
}
答案 0 :(得分:4)
你说:
正如问题所述,我在更新JScrollPane内部的JTextArea文本时遇到了麻烦。
我能够从JScrollPane的类型化getView()中获取文本。但是,我尝试了以下更新JTextArea。
((JTextArea)(chatWindow.getViewport().getView())).setText("Hello!");
为什么要经历所有这些脆弱的代码体操?更简单,更安全和更容易的是创建一个类级JTextArea实例字段,然后在GUI中在JScrollPane中显示,并简单地获取该实例上的文本或设置文本。没有麻烦,没有大惊小怪,没有错误。
如果你当前的程序无法做到这一点,那么你还没有告诉我们足够的建议,否则你需要告诉我们更多。
修改强>
回复你的意见:
有引用JTextArea和JTextField的变量(只是为了试图解决这个问题),但即使我使用上面描述的适当方法之一更改任一变量,JTextArea内部的内容仍然不会改变。除非我不明白你在说什么?
然后这表明,虽然您可能正在使用正确的变量,但也许您正在使用错误的引用。也许您正在使用的变量不会保存在当前显示的GUI中。
但这只是SWAG工作(愚蠢的疯狂猜测工作)。请不要强迫我们猜测 - 编辑原始帖子并向我们展示您的代码,最好是sscce,向我们展示您如何处理这些变量以及您如何知道它们属于<强>显示 gui。
编辑2
关于你的最新代码。我们来看看这一行:
public static JTextArea chatWindowInsert;
编辑3
我现在看到你把一个完全不同的JTextField放到一个JScrollPane中,永远不要把它放到任何地方的GUI中,并在所有地方的按钮上执行所有这些操作!?
userInput.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0)
{
chatWindow = new JScrollPane(new JTextArea(processMessage()));
}
});
建议: