【问题标题】:JTextField to display string from another classJTextField 显示来自另一个类的字符串
【发布时间】:2014-01-07 16:50:46
【问题描述】:

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

例如:

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.java 以使textField1downloadpage.java 中显示来自"string average" 的数据时,我该如何获得它?

任何帮助将不胜感激。

另外,当我运行app.java 时,如何将其设置为首先运行downloadpage.java 以获取平均信息?这样当app.java 运行时,它能够拥有正确的数据,因为数据只在downloadpage.java 运行时生成?

【问题讨论】:

  • 明确您的真实要求。
  • 请进一步澄清——它在做什么?请显示真实代码。同样,您不希望 DownLoadPage 有一个 main 方法。
  • 最好每个线程问一个问题。我建议你将最后一段移到它自己的(问题)线程中。

标签: java string swing user-interface jtextfield


【解决方案1】:

问题:

  • 您在这里误用了继承,因为第二个类应用程序不应扩展下载页面。这里没有“is-a”关系——GUI 不是下载页面的专用版本。
  • 您的 downloadpage 类只是一个 main 方法,没有别的。您的平均变量是 main 方法的本地变量,而不是类字段。使用此设置您几乎无能为力。
  • 请注意,根据 peeskillets 的评论,这个类甚至不应该有一个 main 方法。实际上这个类应该没有静态方法。
  • 而是将下载页面(重命名为 DownLoadPage)变成一个成熟的类,一个具有非静态字段和方法的类。
  • 更好地定义您的实际目标。您是否想给您的非 GUI 类一个字符串,如果更改后,它会更改 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);
   }

}

【讨论】:

  • 我什至不知道从哪里开始。我会把它留给你。别忘了提两个mains :)
  • OP 也可以在 app 类中实例化 downloadPage 而不是扩展。安有getter()
  • 我稍微编辑了一下。我只是简化了 downloadpage.java 以删除其他变量。所以基本上我的新类 DownLoadPage 做了很少的操作并获得了一个变量。例如平均。我正在尝试制作一个基本程序,该程序在运行时会显示一个基本 GUI,该 GUI 在文本字段中显示结果(平均值)。因此,当我运行 app.java 时,它会在 gui 中显示“你好”,或者 DownLoadPage.java 确定的平均值是什么。
  • @user3169964:同样,首先让它成为一个真正的 OOP 类。我怀疑您需要先学习一些 Java 基础知识,否则您可能会不知所措。
  • @user3169964:再次如上所述,通过使用非静态字段、方法、构造函数……Java 的典型介绍告诉您使用的所有东西。
猜你喜欢
  • 1970-01-01
  • 2018-10-02
  • 2012-03-20
  • 2020-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-19
  • 1970-01-01
相关资源
最近更新 更多