Java-如何添加将使用初始类的gui

Java-如何添加将使用初始类的gui,java,jbutton,Java,Jbutton,我已经用几个类编写了一个标准控制台应用程序(web抓取)。main Function唯一能做的就是: -创建一个类的实例 -从创建的对象调用一个方法 现在我需要添加最简单的GUI,它将包含一个按钮来执行上述第二个操作(调用方法)和textarea,以显示NetBeans输出现在显示的所有内容 我用GUI类创建了新文件。它基本上是一个包含jButton和jTextArea的jFrame。我设法让文本输出像我想象的那样工作。但是我不知道如何设置按钮。Netbeans creator将我重定向到这部分

我已经用几个类编写了一个标准控制台应用程序(web抓取)。main Function唯一能做的就是: -创建一个类的实例 -从创建的对象调用一个方法

现在我需要添加最简单的GUI,它将包含一个按钮来执行上述第二个操作(调用方法)和textarea,以显示NetBeans输出现在显示的所有内容

我用GUI类创建了新文件。它基本上是一个包含jButton和jTextArea的jFrame。我设法让文本输出像我想象的那样工作。但是我不知道如何设置按钮。Netbeans creator将我重定向到这部分代码:

private void buttonActionPerformed(java.awt.event.ActionEvent evt) {                                       
    // TODO add your handling code here:

    p1.use(); // <<< my initial try
}
private void按钮执行的操作(java.awt.event.ActionEvent evt){
//TODO在此处添加您的处理代码:

p1.use();//您需要通过构造函数或setter将p1对象从主类传递到GUI的类中,否则它不知道您要访问什么

比如说,

public class MainClass {
    private MyGuiClass gui;
    private P1Class    p1;

    public static void main(String[] args) {
        p1  = new P1Class( /*arguments*/ );
        gui = new MyGuiClass( p1, /*other arguments*/ );
    }
    // Other logic...
}

public class MyGuiClass extends JFrame {
    private P1Class p1;
    public MyGuiClass( P1Class p1, /*other arguments*/ ) {
        this.p1 = p1;
    }
    // Other logic...
}

此时,您可以在代码的其余部分中引用p1对象。

有很多方法可以实现这一点

情景1

通过使jFrame对象在主类中保持静态,使其可以访问对象p1

public class Main {
    public static P1 p1;

    public static void main(String[] args) {
        p1 = new P1();
        //open window etc.
    }
}

public class MyFrame extends JFrame {
    private void buttonActionPerformed(java.awt.event.ActionEvent evt) {
        // Access object by static reference
        Main.p1.use();
    }
}
场景2

您可以将对象
P1
作为参数传递给jFrame对象的构造函数

public class Main {
    public static void main(String[] args) {
        P1 p1 = new P1();
        new MyFrame(p1);
        //open window etc.
    }
}

public class MyFrame extends JFrame {
    private P1 p1;

    public MyFrame(P1 param) {
        // Save object inside the JFrame object
        this.p1 = param;
    }

    private void buttonActionPerformed(java.awt.event.ActionEvent evt) {
        p1.use();
    }
}

听说静态对象或变量不是最好的习惯,特别是对初学者来说,但它确实是一个解决方案。感谢您提供的示例。您是对的,第二个解决方案可能是可行的,我只列出了2个选项。您还可以选择将P1设置为单例,以便您可以从任何地方访问它,但这取决于nds如果类P1真的适合这样的用途。谢谢。我之前怎么能不考虑它…然而,问题来了-如果我需要在GUI类构造之后在main中创建对象,该怎么办。从GUI调用一些setter来传递对象?但是我想我需要在运行应用程序之前声明它。可能声明ArrayList将是一个解决方案?然后构造函数和其他setter将能够在任何时候捕获任意数量的对象并生成某种堆栈。我是否遵循正确的轨道?除非您计划使用多个P1类,否则您不应该需要ArrayList。如果GUI类必须在P1类之前声明,您可以添加一个acti作为setter的一部分,在setter中,您将拥有
this.p1=p1;
,然后是
buttonName.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){p1.use();})
谢谢。这是一个理论问题。我的意思是特殊情况:一个对象在GUI类实例之前创建,但是在运行时需要创建更多的对象。比如:p1=新的P1Class(/*参数*/);GUI=新的MyGuiClass(p1,/*其他参数*/);p2=新的P1Class(/*参数*/);GUI.set(p2);然而,我认为一旦在main类中创建GUI实例,在main中就不会有进一步的操作,因为所有的处理都交给GUI和用户,所以提到的示例没有任何用处。这个假设正确吗?