首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JTextArea问题

JTextArea问题
EN

Stack Overflow用户
提问于 2014-11-24 04:49:33
回答 3查看 208关注 0票数 0

我的节目是这样的,

  1. 运行程序,第一个Jframe弹出(文本编辑器)。
  2. 我点击计算器按钮和一个Jframe弹出(单位转换器)与一个按钮和一个文本字段。
  3. 我在第一个文本字段中输入一个数字(华氏温度到摄氏),单击“华氏到摄氏”按钮,但转换不会附加到文本编辑器中的文本区域。
  4. 我关闭“单位转换器”窗口,再次单击“计算器”按钮,我第一次输入的“华氏到摄氏”字段中的文本仍然存在。这是我第二次单击计算器按钮时,就会发生转换,并将其附加到文本区域。

我希望一旦我按下“华氏到摄氏”按钮,数据就被附加到“文本编辑器”( textArea )中。

我有四个不同的课程(这是我的教授希望我们的项目设置的方式) :/这是我的“主”班

代码语言:javascript
复制
public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Program p = new Program();
        }

}

下面是我的“程序”课

代码语言:javascript
复制
import javax.swing.JFrame;

public class Program {

    public Program(){

        TextEditor textEditor = new TextEditor();
        textEditor.setVisible(true);
        textEditor.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Calculator calculator = new Calculator();
        calculator.setVisible(false);
        calculator.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);

    }
}

下面是我的"TextEditor类“,我省略了一些按钮,因为这些按钮不会导致任何问题。

代码语言:javascript
复制
public class TextEditor extends JFrame implements ActionListener{
JTextArea textArea;
JButton calculatorButton;

Calculator c = new Calculator();

public TextEditor(){
    super("TextMe");
    this.setLayout(new BorderLayout());
    loadMenuBar();
    loadToolBar();
    loadTextArea();
    this.pack();
}

private void loadTextArea() {
    // TODO Auto-generated method stub
    textArea = new JTextArea();
    textArea.setPreferredSize(new Dimension(800,600));
    this.add(BorderLayout.CENTER, textArea);
}

private void loadToolBar() {
    // TODO Auto-generated method stub

    JToolBar toolBar;
// CALCULATOR BUTTON
    calculatorButton = new JButton(new    ImageIcon(this.getClass().getResource("/images/calculator.png")));
    calculatorButton.addActionListener(this);

// TOOL BAR
    toolBar = new JToolBar(JToolBar.HORIZONTAL);
toolBar.add(calculatorButton);
    this.add(BorderLayout.PAGE_START, toolBar);
}

@Override
public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    if(e.getSource() == calculatorButton){
            loadCalculator ();

        }
    }

private void loadCalculator() {
    // TODO Auto-generated method stub
    {
    c.setVisible(true);
    c.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
    this.setLayout(new FlowLayout());

    }
    if(!c.fToC.getText().isEmpty()){
    textArea.setText(String.valueOf(c.fahrenheit));
    }
}

}

最后,这是我的“计算器”类。再次,很抱歉这里有这么多代码。

代码语言:javascript
复制
public class Calculator extends JFrame implements ActionListener{
        JButton fToCButton;
    JTextField fToC;
double fahrenheit;

public Calculator(){
            super("Unit Converter");
            this.setLayout(new FlowLayout());

fToC = new JTextField(5);
fToCButton = new JButton("Ferenheit To Celcius");
fToCButton.addActionListener(this);

add(fToCButton, BorderLayout.WEST);
add(fToC);

this.pack();

@Override
public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    if(e.getSource() == fToCButton){
    degreeConversion(); 

}

}

    public void degreeConversion() {
    // TODO Auto-generated method stub
    double conversion = Double.parseDouble(fToC.getText());
    fahrenheit = (((conversion -32) * 5) / 9);

    }   
}
EN

回答 3

Stack Overflow用户

发布于 2014-11-24 05:17:16

Calculator类独立于TextArea类。我在您的代码中看到的问题如下:

  1. 在Program类中,不需要实例化Calculator类
  2. 在TextArea类中,不要先实例化计算器类,应该在loadCalculator方法中实例化它。
  3. 使计算器扩展JDialog,并将TextArea类的实例传递给其构造函数,并将此对话框设置为模式。
  4. 在进行计算时,该值存储在一个双变量中。当按下按钮并在此时调用degreeConversion时,您可以做两件事:调用TextArea类的一个方法,将双值设置为textArea类中的TextArea,或者当窗口关闭时(添加其侦听器),然后调用degreeConversion或TextArea updateValue方法。

对于第4点,应该如下所示:

代码语言:javascript
复制
public class TextArea extends JFrame {
    ...
    private JTextArea textArea;
    private void loadCalculator() {
        Calculator c = new Calculator(this)
        c.setVisible(true);
    }

    public void updateValue(String str) {
        textArea.setText(str);
    }
}

public class Calculator extends JDialog() {
    private TextArea parent;
    public Calculator(TextArea parent) {
        super(parent, true); //or something like this to make it dialog I dont remember the exact syntax
        this.parent = parent;
        ...
    }
    ...
    private void degreeConversion() {
        double f = ...
        parent.updateValue(String.valueOf(f));
    }
}
票数 1
EN

Stack Overflow用户

发布于 2014-11-24 05:05:06

问题在于将文本区域添加到框架中的方式:

是你干的:

代码语言:javascript
复制
this.add(BorderLayout.CENTER, textArea);

而不是通常的:

代码语言:javascript
复制
this.add(textArea, BorderLayout.CENTER);

代码仍然会编译,但是您刚刚使用了一个不推荐的add方法将组件添加到内容窗格中。根据此文档添加签名

此方法更改与布局相关的信息,从而使组件层次结构无效。如果容器已经显示,则必须在其后验证层次结构,以显示添加的组件。

这就解释了为什么你--这仅仅是第二次--显示文本。使用正确的方法签名,否则请确保在文本区域的框架上调用validate以显示新文本。

来源

票数 0
EN

Stack Overflow用户

发布于 2014-11-24 05:13:54

你的问题是:

代码语言:javascript
复制
private void loadCalculator() {
  c.setVisible(true);
  c.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
  this.setLayout(new FlowLayout());

  if (!c.fToC.getText().isEmpty()) {
     textArea.setText(String.valueOf(c.fahrenheit));
  }
}

您正在尝试从Calculator对象中立即提取信息,在对象显示之前,用户还没有机会与其交互。

解决这一问题的一种方法是让您的主GUI侦听对计算器的更改,比如将自己的ActionListener添加到计算器的按钮中,或者让计算器知道主GUI,并在按下其按钮时将其信息推到主GUI的文本组件中。

注意,计算器窗口应该是一个对话框窗口,比如一个JDialog,而不是一个JFrame。

顺便提一下,Program.java中的这段代码:

代码语言:javascript
复制
  Calculator calculator = new Calculator();
  calculator.setVisible(false);
  calculator.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);

完全没有必要,因为它没有任何用处,因为它创建了一个从不显示的Calculator实例。

例如,如果您给Calculator此方法:

代码语言:javascript
复制
public void addActionListener(ActionListener actionListener) {
    fToCButton.addActionListener(actionListener);
}

允许外部类向其按钮添加ActionListener

然后在TextEditor程序中添加ActionListener:

公共TextEditor() {超级(“TextMe”);this.setLayout(新的BorderLayout());loadMenuBar();loadToolBar();loadTextArea();this.pack();

代码语言:javascript
复制
  c.addActionListener(new ActionListener() {

     @Override
     public void actionPerformed(ActionEvent e) {
        if (!c.fToC.getText().isEmpty()) {
           textArea.setText(String.valueOf(c.fahrenheit));
        }
     }
  });

并摆脱:

代码语言:javascript
复制
private void loadCalculator() {
   c.setVisible(true);
   c.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
   this.setLayout(new FlowLayout());

   // if (!c.fToC.getText().isEmpty()) {
   // textArea.setText(String.valueOf(c.fahrenheit));
   // }
}

密码应该能用。请注意,您不应该直接访问其他类的字段,所有字段都应该是私有的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27098054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档