JTextArea问题

时间:2014-11-24 04:49:33

标签: java swing actionlistener jtextarea

以下是我的计划的内容,

  1. 运行程序,首先弹出Jframe(文本编辑器)。
  2. 我点击计算器按钮,弹出一个Jframe(单位转换器),带有1个按钮和1个文本字段。
  3. 我在第一个文本字段(华氏温度到摄氏温度)中输入一个数字,单击华氏温度到摄氏温度按钮,但转换不会附加到文本编辑器中的文本区域。
  4. 我关闭了#34; Unit Converter"窗口,再次单击计算器按钮,我第一次在"华氏度到摄氏度"场仍然存在。第二次单击计算器按钮时,转换发生并附加到文本区域。
  5. 我希望将数据附加到"文本编辑器" textArea我按下"华氏温度到摄氏温度"按钮。

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

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

    接下来,这是我的"计划"类

    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);
    
        }
    }
    

    这是我的#34; TextEditor类"我省略了一些按钮,因为这些按钮不是导致任何问题的原因。

    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));
        }
    }
    

    }

    最后,这是我的"计算器"类。再次,抱歉这里有太多代码。

    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);
    
        }   
    }
    

3 个答案:

答案 0 :(得分:1)

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

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

    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 :(得分:0)

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

你这样做了:

this.add(BorderLayout.CENTER, textArea);

而不是通常的:

this.add(textArea, BorderLayout.CENTER);

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

  

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

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

Source

答案 2 :(得分:0)

你的问题在这里:

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));
  }
}

您尝试从计算器对象中提取信息立即,然后 ,然后用户才有机会与之互动。

解决此问题的一种方法是让主GUI监听计算器的更改,比如将自己的ActionListener添加到计算器的按钮,或让计算器知道主GUI并让它推送当按下按钮时,将其信息输入主GUI的文本组件中。

请注意,Calculator窗口应该是一个对话窗口,例如JDialog而不是JFrame。

另外,这个代码在Program.java中:

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

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


例如,如果您给这个方法计算器:

public void addActionListener(ActionListener actionListener) {
    fToCButton.addActionListener(actionListener);
}

允许外部类将ActionListener添加到其按钮

然后在TextEditor程序中添加ActionListener:

public TextEditor(){       超级(" TextMe&#34);       this.setLayout(new BorderLayout());       loadMenuBar();       loadToolBar();       loadTextArea();       this.pack();

  c.addActionListener(new ActionListener() {

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

并摆脱:

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));
   // }
}

代码应该有效。请注意,您不应该直接访问其他类的字段,并且所有字段都应该是私有的。