首页 > 解决方案 > 从不同于 GUI 的类更新 TextField

问题描述

我正在尝试从不同的类更新 GUI。每次我尝试在不同的类上调用该方法时,它都不起作用,但如果我在 GUI 类中调用它,它就可以正常工作。

图形界面类:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Test7 extends JPanel implements ActionListener {
 private JButton jcomp1;
 private JButton jcomp2;
 private JButton jcomp3;
 private JTextField jcomp4;

 public Test7() {
  //construct components
  jcomp1 = new JButton("Button 1");
  jcomp2 = new JButton("Button 2");
  jcomp3 = new JButton("Button 3");
  jcomp4 = new JTextField(5);
  jcomp1.addActionListener(this);


  //adjust size and set layout
  setPreferredSize(new Dimension(723, 455));
  setLayout(null);

  //add components
  add(jcomp1);
  add(jcomp2);
  add(jcomp3);
  add(jcomp4);

  //set component bounds (only needed by Absolute Positioning)
  jcomp1.setBounds(160, 320, 100, 20);
  jcomp2.setBounds(340, 320, 100, 20);
  jcomp3.setBounds(490, 315, 140, 20);
  jcomp4.setBounds(180, 125, 365, 110);
 }


 public static void main(String[] args) {
  JFrame frame = new JFrame("MyPanel");
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.getContentPane().add(new Test7());
  frame.pack();
  frame.setVisible(true);
 }

 public void setTextArea(JTextField jcomp4) {

  this.jcomp4 = jcomp4;

 }


 public JTextField getTextArea() {
  return this.jcomp4;
 }

 public void actionPerformed(ActionEvent e) {    
  if (e.getSource() == jcomp1) {    
   Class class1 = new Class();
   class1.start();    
  }
 }
}

二等:

public class Class extends Test7{

        public void start(){
            Test7 form = new Test7();
            form.getTextArea().setText("nesto");
        }
}

我也尝试将代码放在同一个线程上,但这似乎也不起作用。

标签: javaswingclassuser-interface

解决方案


Test7是JPanel。它在您的 main 方法中添加到 JFrame 中。当您调用时,Class.start()您创建新的Test7. 这个新的 JPanel 与之前添加到 JFrame 的 JPanel 无关,因此它甚至不可见。

您的Class类既不应该扩展也不应该创建新Test7实例。相反Test7,实例可以在构造函数中传递给Class

Class class1 = new Class(this);
class1.start();

你的Class班级:

public class Class {

    private final Test7 test;

    public Class(Test7 test) {
        super();
        this.test = test;
    }

    public void start() {
        test.getTextArea().setText("nesto");

    }
}

安德鲁的评论也值得思考。


推荐阅读