如何在Java中的main之外的类中将文本附加到文本字段?

时间:2014-07-27 21:21:38

标签: java swing

我是java的新手,我正在尝试输出到主要课程之外的课程中的文本字段,我无法让它工作。

在我的主要内容中,我有:

public static void main(String[] args) {
    GUI gu = new GUI ();
    gu.display.append("hi");
}

在我的GUI课程中,我有:

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

 public class GUI extends JFrame{
      public GUI(){
         FlowLayout flo = new FlowLayout();
         Container pane = getContentPane();

         JTextArea display = new JTextArea (30, 90);
         JButton button = new JButton("CLICK ME");
         JLabel label = new JLabel("Dont Click Him!");

         setTitle("Merchables!?");
         setVisible(true);
         setSize(1000,600);
         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         pane.setLayout(flo);
         pane.add(display);
         pane.add(button);
         pane.add(label);
   }
}

3 个答案:

答案 0 :(得分:0)

您需要显示类GUI的公共字段。

public class GUI extends JFrame{
    public final JTextArea display;
    public GUI(){
        FlowLayout flo = new FlowLayout();
        Container pane = getContentPane();

        display = new JTextArea (30, 90);

        JButton button = new JButton("CLICK ME");
        JLabel label = new JLabel("Dont Click Him!");

        setTitle("Merchables!?");
        setVisible(true);
        setSize(1000,600);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pane.setLayout(flo);
        pane.add(display);
        pane.add(button);
        pane.add(label);
    }
}

答案 1 :(得分:0)

我认为你得到的错误是因为变量'显示'是最近的花括号{}的范围的本地。

这意味着它只适用于:public GUI(){..// scope here}

您想要的是将显示变量移到方法之外,并使其可供其他方法访问。如下:

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

 public class GUI extends JFrame{
      // Now display is publicly accessible outside the GUI class
      public JTextArea display;
      public GUI(){
         FlowLayout flo = new FlowLayout();
         Container pane = getContentPane();

         display =  = new JTextArea (30, 90);
         JButton button = new JButton("CLICK ME");
         JLabel label = new JLabel("Dont Click Him!");

         setTitle("Merchables!?");
         setVisible(true);
         setSize(1000,600);
         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         pane.setLayout(flo);
         pane.add(display);
         pane.add(button);
         pane.add(label);
   }
}

我建议您使用get和set方法查找封装。使用公共变量是不好的做法。应该使用私有变量,并且应该使用get / set方法来访问它们。

例如:

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

 public class GUI extends JFrame{
      // Now display is private to the GUI class
      private JTextArea display;
      public GUI(){
         FlowLayout flo = new FlowLayout();
         Container pane = getContentPane();

         display =  = new JTextArea (30, 90);
         JButton button = new JButton("CLICK ME");
         JLabel label = new JLabel("Dont Click Him!");

         setTitle("Merchables!?");
         setVisible(true);
         setSize(1000,600);
         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         pane.setLayout(flo);
         pane.add(display);
         pane.add(button);
         pane.add(label);
   }

   // Get accessor method for display variable
   public JTextArea getDisplay() {
         return display;
   }
}

现在,在你的主要编辑显示中,你想要获得显示变量并附加文本:

public static void main(String[] args) {
    GUI gu = new GUI ();
    gu.getDisplay().append("hi");
}

最后,如果您对其他直接访问该对象的类感到困扰(根据MadProgrammer的评论),更好的方法可能是在GUI类中使用它:

   // Method to access and append text to display variable without getting it
   public void appendToDisplay(String text) {
         display.append(text);
   }

然后打电话给那个。这允许调用者仅将文本附加到显示变量,而不是他们喜欢的任何内容。您现在的主要方法如下:

   public static void main(String[] args) {
         GUI gu = new GUI ();
         gu.appendToDisplay("hi");
   }

答案 2 :(得分:0)

可以通过多种方式实现这一目标,母亲最简单的方法可能是提供其他课程可以访问JTextArea的方法。

您需要解决的第一个问题是更改JTextArea的引用上下文,因为它目前只能从GUI构造函数中的本地上下文访问

public class GUI extends JFrame{
    public GUI(){
        //.,,
        JTextArea display = new JTextArea (30, 90);

这意味着只能在构造函数的上下文中访问显示。

您需要移动display以便可以从类上下文中访问它,即将其设为类或实例字段...

public class GUI extends JFrame{
    JTextArea display;
    public GUI(){
        //.,,
        display = new JTextArea (30, 90);

下一个问题是决定如何允许访问display。您可以创建类字段public ...

public class GUI extends JFrame{
    public JTextArea display;

但这会将display暴露给任何人。 GUI组件是具有多个属性和状态的复杂对象。以这种方式公开GUI组件将使您无法管理此对象的状态和属性,它还会使组件暴露于滥用状态,因为其他类可以突然执行他们喜欢/使用它的任何内容...这不是很合乎需要的。

更好的解决方案是限制对字段的访问,并通过使用类中的方法来提供管理功能......

public class GUI extends JFrame{
    private JTextArea display; // Only accessible from this instance of GUI

    //...

    public void appendDisplay(String text) {
        display.append(text);
    }

    public String getDisplayText() {
        return display.getText();
    }

这意味着您GUI类现在可以控制对display的访问,并确定其他类可以对其执行的操作...

查看Controlling Access to Members of a Class了解更多详情......