我对Java非常陌生,我正在为自己设置一个编写Caesar移位密码解码器的挑战。我基本上试图从另一个类中清除JTextArea。我有两个类,一个叫做CrackerGUI的GUI类和一个shift类。 JtextArea在GUI类中以及以下方法:
public void setPlainTextBox(String text)
{
plainTextBox.setText(text);
}
GUI类还有一个带有以下内容的清除按钮:
private void btnClearActionPerformed(java.awt.event.ActionEvent evt) {
Shift classShift = new Shift();
classShift.btnClear();
}
最后我在shift类中有方法来清除JTextArea。
public class Shift extends CrackerGUI {
public void btnClear()
{
CrackerGUI gui = new CrackerGUI();
gui.setPlainText(" ");
System.out.println("testing");
}
}
测试文本正在打印到控制台,但JTextArea不会清除。我不确定为什么:)。我确信这是一个非常简单的错误,但令我感到困惑。任何帮助将不胜感激。
提前谢谢。
答案 0 :(得分:3)
您滥用继承来解决不涉及继承的问题。没有Shift扩展CrackerGUI并且不在btnClear()方法内创建新的CrackerGUI对象,因为CrackerGUi都不是显示的那个。而是让Shift保持对显示的CrackerGUI对象的引用,并让它调用此对象的公共方法。
例如,
public class Shift {
private CrackerGUI gui;
// pass in a reference to the displayed CrackerGUI object
public Shift(CrackerGUI gui) {
this.gui = gui;
}
public void btnClear() {
//CrackerGUI gui = new CrackerGUI();
gui.setPlainText(" ");
System.out.println("testing");
}
}
您也可能不应该在GUI的actionPerformed方法中创建新的Shift对象,而是只使用一个类对象的Shift对象。
答案 1 :(得分:3)
btnClear方法清除新CrackerGUI实例的文本区域。就像你想要通过拍一张新的空白纸并清除它来清除纸张上的图纸一样。原始纸张将保留其图纸。
您需要将gui实例传递给Shift:
public class Shift {
private CrackerGUI gui;
public Shift(CrackerGUI gui) {
this.gui = gui;
}
public void btnClear() {
this.gui.setPlainText(" ");
}
}
并在CrackerGUI类中:
private void btnClearActionPerformed(java.awt.event.ActionEvent evt) {
Shift classShift = new Shift(this);
classShift.btnClear();
}
答案 2 :(得分:0)
假设CrackerGUI是您的GUI,您应该改为:
public class CrackerGUI {
public void setPlainTextBox(String text)
{
plainTextBox.setText(text);
}
public void btnClear()
{
setPlainTextBox("");
System.out.println("testing");
}
}
最后一件事,永远不要公开您的GUI元素!您应该要求GUI清除自己,并将清除元素的知识隐藏在其中。
答案 3 :(得分:-2)
你可以尝试使用静态方法,因为你最终会创建一个新的gui,然后显示那个,而不是已经显示的那个。
这将要求父类也是静态的,这可能会导致某些方法出错,只是抬头。
否则,您可以创建自己的setText方法:
void setText(JTextField t, String s){
t.setText(s);
}
可以让您直接编辑当前GUI中的组件。