向initComponents[java netbeans]添加参数的其他方法

向initComponents[java netbeans]添加参数的其他方法,java,swing,netbeans,jframe,parameter-passing,Java,Swing,Netbeans,Jframe,Parameter Passing,我在netbeans中的GUI java项目有一个很大的问题。 众所周知,netbeans编译的代码是只读的,除了调用与initComponents相同的myInitComponents方法并在构造函数中调用它之外,我还需要另一种方法向initComponents方法添加参数。 现在我有这个: public class MainFrame { public MainFrame() { DefaultStyledDocument doc = new DefaultStyle

我在netbeans中的GUI java项目有一个很大的问题。 众所周知,netbeans编译的代码是只读的,除了调用与initComponents相同的myInitComponents方法并在构造函数中调用它之外,我还需要另一种方法向initComponents方法添加参数。 现在我有这个:

public class MainFrame {

    public MainFrame() {
       DefaultStyledDocument doc = new DefaultStyledDocument();
       myInitComponents(doc);
    }

    myInitComponents (DefaultStyledDocument doc) {
       //components
       textModel = new javax.swing.JTextPane(doc);
       //components
    }

    initComponents () {
      //components
    }
通过这种方式,它可以工作,但每次我在框架内更改某些内容时,我都必须在myInitComponent中复制和pase initComponents的所有新代码。 此外,这是一种非常糟糕的方式。 是否有其他方法添加该参数?
感谢您的帮助

您可以向大型机构造函数添加参数,将其放置在字段中,使用GUI生成器属性表中的自定义创建代码

在initComponents的代码中可以插入几个免费的代码位置。创建自定义代码就是这样一个地方

private final DefaultStyledDocument doc = new DefaultStyledDocument();
在“自定义创建代码”中:

也可用于定制面板等

我在netbeans中的GUI java项目有一个很大的问题。众所周知,netbeans编译的代码是只读的,除了调用与initComponents相同的myInitComponents方法并在构造函数中调用它之外,我还需要另一种方法向initComponents方法添加参数

我认为您可能会混淆使用构造函数进行初始化和使用设置器访问值

这无异于问:如果您有一个具有a、b和c等属性的类,那么如何创建一个设置所有属性的setter。这是你应该避免的。您可以为每个属性创建一个单独的setter和getter,而不是尝试使用
init
来设置所有属性

您应该这样做:

class MyClass
{
    private int a;
    private int b;
    private int c;

    public MyClass(){
        init();
    }

    private void init(){
        a = 100;
        b = 200;
        c = 300;
    }

    public int getA(){return a;}  
    public int getB(){return b;}
    public int getC(){return c;}

    public void setA(int a){this.a = a;}
    public void setB(int b){this.a = b;}
    public void setC(int c){this.a = c;}
}
class MyClass
{
    private int a;
    private int b;
    private int c;

    public MyClass(){
        init();
    }

    private void init(){
        a = 100;
        b = 200;
        c = 300;
    }

    public void myInit(int a, int b, int c){
        this.a = a;
        this.b = b;
        this.c = c;
    }
}
而不是这个:

class MyClass
{
    private int a;
    private int b;
    private int c;

    public MyClass(){
        init();
    }

    private void init(){
        a = 100;
        b = 200;
        c = 300;
    }

    public int getA(){return a;}  
    public int getB(){return b;}
    public int getC(){return c;}

    public void setA(int a){this.a = a;}
    public void setB(int b){this.a = b;}
    public void setC(int c){this.a = c;}
}
class MyClass
{
    private int a;
    private int b;
    private int c;

    public MyClass(){
        init();
    }

    private void init(){
        a = 100;
        b = 200;
        c = 300;
    }

    public void myInit(int a, int b, int c){
        this.a = a;
        this.b = b;
        this.c = c;
    }
}
这是一种非常糟糕的方式。是否有其他方法添加该参数

所以你问,如果你还有一个属性,比如
intd
。如何将其添加到
myInit()的参数列表中
。因此,您已经开始看到这种方法在类设计中存在的问题

如果可能,我们在设计中尝试实现低耦合高内聚。当您在一个方法中转储各种不相关的属性时,您将转向低内聚性(一种不执行非常特定任务的方法)

如果尝试使用一个方法,如
myInit()
,并将其用作设置多个字段的setter,则可能会导致许多问题

  • 如果用户只想设置一个特定属性,而不想设置其他属性,该怎么办

因此,要回答您的问题,请为每个属性使用单独的setter,除非这些属性密切相关,例如:

setLocation(int x, int y);
setBounds(int x, int y, int width, int height);

最后我用一种非常简单的方法解决了这个问题。我在initComponents()方法中插入了DefaultStyleDocument所需的所有代码,方法是单击自定义代码,并将其添加为预创建代码

public class MainFrame {

    public MainFrame() {

       myInitComponents();
    }

  //delete the myInitComponents() method

    initComponents () {
   //code useful for the DefaultStyledDocument..
    DefaultStyledDocument doc = new DefaultStyledDocument();
      //components
      textModel = new javax.swing.JTextPane(doc);
    }

希望这对其他人有用。

您可以看看下面我的解决方案。