JTextField显示来自另一个类的字符串

时间:2014-01-07 16:50:47

标签: java string swing user-interface jtextfield

我有一个小问题:我的第一堂课,例如打印出一个名为“average”的字符串。字符串平均值为“hello”。

例如:

package downloadpage;

public class DownLoadPage {

public void main(String[] args) throws IOException {
  string average;
  average = "hello";
  System.out.print(average);

我的第二课app.java,显示一个文本字段。

package downloadpage;

public class app {

private JFrame frame;
JTextField textField1;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                app window = new app();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the application.
 */
public app() {
    initialize();
}


/**
 * 
 * Initialize the contents of the frame.
 */
private void initialize() {
    frame = new JFrame();
    frame.setBounds(100, 100, 450, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    textField1 = new JTextField();

    frame.getContentPane().add(textField1, BorderLayout.NORTH);
    textField1.setColumns(10);
}
}

当我运行app.javatextField1显示来自"string average"的{​​{1}}的数据时,我怎样才能获得它?

非常感谢任何帮助。

此外,当我运行downloadpage.java时,如何将其设置为首先运行app.java以获取平均信息?这种方式当downloadpage.java运行时能够获得正确的数据,因为数据仅在app.java运行后生成?

1 个答案:

答案 0 :(得分:3)

问题:

  • 你在这里滥用继承是因为第二类app不应该扩展下载页面。这里没有“is-a”关系 - GUI不是下载页面的专用版本。
  • 您的下载页面类只不过是一种主要方法而已。您的平均变量是main方法的本地变量而不是类字段您可以使用此设置做很少的事情。
  • 请注意,根据peeskillets的评论,这个类甚至不应该有一个主方法。实际上这个类应该没有静态方法。
  • 而是将下载页面(将其重命名为DownLoadPage)转换为完整的类,其中包含非静态字段和方法。
  • 更好地定义您的实际目标。您是否想要给非GUI类提供一个String,如果更改,则更改GUI中的显示?如果是这样,请考虑使用PropertyChangeSupport和PropertyChangeListeners将其设为“绑定”属性。
  • 如果您对Java不熟悉,请在深入研究GUI编码之前先考虑学习一些入门Java,因为在完成后者之前需要先了解基础知识。你不会后悔这样做。
  • 学习Java命名约定并使用它们,因为这将有助于其他人理解您的代码:类名以大写字母开头,而方法和变量以小写字母开头。

修改
例如:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.*;
import javax.swing.event.SwingPropertyChangeSupport;

@SuppressWarnings("serial")
public class GuiClass extends JPanel {
   private NonGuiClass nonGuiClass;
   private JTextField field = new JTextField(15);

   public GuiClass(NonGuiClass nonGuiClazz) {
      this.nonGuiClass = nonGuiClazz;
      add(field);
      nonGuiClass.addPropertyChangeListener(new PropertyChangeListener() {

         @Override
         public void propertyChange(PropertyChangeEvent pcEvt) {
            if (NonGuiClass.ADDRESS.equals(pcEvt.getPropertyName())) {
               field.setText(nonGuiClass.getAddress());
            }
         }
      });
   }

   private static void createAndShowGUI() {
      final NonGuiClass nonGuiClass = new NonGuiClass();
      GuiClass paintEg = new GuiClass(nonGuiClass);

      JFrame frame = new JFrame("GUI");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(paintEg);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);

      final String[] testStrings = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday"};

      int timerDelay = 1000;
      new Timer(timerDelay, new ActionListener() {
         private int index = 0;

         @Override
         public void actionPerformed(ActionEvent evt) {
            nonGuiClass.setAddress(testStrings[index]);
            index++;
            index %= testStrings.length;
         }
      }).start();
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGUI();
         }
      });
   }
}

class NonGuiClass {
   public static final String ADDRESS = "address";
   private SwingPropertyChangeSupport propChangeSupport = 
         new SwingPropertyChangeSupport(this);
   private String address = "";

   public String getAddress() {
      return address;
   }

   public void setAddress(String address) {
      String oldValue = this.address;
      String newValue = address;
      this.address = address;
      propChangeSupport.firePropertyChange(ADDRESS, oldValue, newValue);
   }

   public void addPropertyChangeListener(PropertyChangeListener listener) {
      propChangeSupport.addPropertyChangeListener(listener);
   }

   public void removePropertyChangeListener(PropertyChangeListener listener) {
      propChangeSupport.removePropertyChangeListener(listener);
   }

}