简体   繁体   English

Netbeans Java SE GUI Builder:私有initComponents()问题

[英]Netbeans Java SE GUI Builder: private initComponents() problem

When I build a GUI for my Java SE app with Netbeans GUI builder, it puts all the codes in the initComponents() method which is private. 当我使用Netbeans GUI构建器为Java SE应用程序构建GUI时,它将所有代码放入私有的initComponents()方法中。 I could not change it to public. 我无法将其更改为公开。 So, all the components are accessible only to the class containing the UI. 因此,所有组件只能由包含UI的类访问。

I want to access those components from another class so that I can write custom event handlers and everything. 我想从另一个类访问这些组件,以便编写自定义事件处理程序以及所有内容。 Most importantly I want to separate my GUI code and non-GUI from each other. 最重要的是,我想将我的GUI代码和非GUI彼此分开。

I can copy paste the GUI code and later make them public by hand to achieve what I want. 我可以复制粘贴GUI代码,然后手动将其公开,以实现所需的功能。 But thats a pain. 但这就是痛苦。 I have to handcraft a portion whenever I need to re-design the UI. 每当我需要重新设计UI时,我都必须手工制作一部分。

What I tried to do: 我试图做的是:

I used the variable identifier to make the text box public. 我使用变量标识符使文本框公开。 Now how can I access the text box from the Main class? 现在如何从Main类访问文本框? I think I need the component generated in a public method as well. 我想我也需要用公共方法生成的组件。

I am new to Java. 我是Java新手。 Any helps? 有帮助吗?

Here's the sample classes: 这是示例类:

The UI (uiFrame.java) 用户界面 (uiFrame.java)

    /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * uiFrame.java
 *
 * Created on Jun 3, 2010, 9:33:15 PM
 */
package barcode;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFileChooser;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import net.sourceforge.barbecue.output.OutputException;

/**
 *
 * @author masnun
 */
public class uiFrame extends javax.swing.JFrame {

    /** Creates new form uiFrame */
    public uiFrame() {
        try {
            try {
                // Set cross-platform Java L&F (also called "Metal")
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (ClassNotFoundException ex) {
                Logger.getLogger(uiFrame.class.getName()).log(Level.SEVERE, null, ex);
            } catch (InstantiationException ex) {
                Logger.getLogger(uiFrame.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IllegalAccessException ex) {
                Logger.getLogger(uiFrame.class.getName()).log(Level.SEVERE, null, ex);
            } catch (UnsupportedLookAndFeelException ex) {
                Logger.getLogger(uiFrame.class.getName()).log(Level.SEVERE, null, ex);
            }
        } finally {
        }


        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        label1 = new javax.swing.JLabel();
        textBox = new javax.swing.JTextField();
        saveButton = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        label1.setFont(label1.getFont().deriveFont(label1.getFont().getStyle() | java.awt.Font.BOLD, 13));
        label1.setText("Type a text:");
        label1.setName("label1"); // NOI18N

        saveButton.setText("Save");
        saveButton.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                saveButtonMousePressed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(56, 56, 56)
                .addComponent(textBox, javax.swing.GroupLayout.PREFERRED_SIZE, 272, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(72, Short.MAX_VALUE))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(154, Short.MAX_VALUE)
                .addComponent(saveButton, javax.swing.GroupLayout.PREFERRED_SIZE, 102, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(144, 144, 144))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(140, Short.MAX_VALUE)
                .addComponent(label1, javax.swing.GroupLayout.PREFERRED_SIZE, 133, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(127, 127, 127))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(label1, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(textBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(saveButton)
                .addContainerGap(193, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

    @SuppressWarnings("static-access")
    private void saveButtonMousePressed(java.awt.event.MouseEvent evt) {                                        
        JFileChooser file = new JFileChooser();
        file.showSaveDialog(null);
        String data = file.getSelectedFile().getAbsolutePath();
        String text = textBox.getText();
        BarcodeGenerator barcodeFactory = new BarcodeGenerator();
        try {
            barcodeFactory.generateBarcode(text, data);
        } catch (OutputException ex) {
            Logger.getLogger(uiFrame.class.getName()).log(Level.SEVERE, null, ex);
        }


    }                                       
    /**
     * @param args the command line arguments
     */
    // Variables declaration - do not modify
    private javax.swing.JLabel label1;
    private javax.swing.JButton saveButton;
    public javax.swing.JTextField textBox;
    // End of variables declaration
}

The Main Class (Main.java) 主类 (Main.java)

package barcode;


import javax.swing.JFrame;


public class Main {

    public static void main(String[] args) {

        JFrame ui = new uiFrame();
        ui.pack();
        ui.show();




    }


}

When you click any component in GUI Builder you can change access level. 当您单击GUI Builder中的任何组件时,您可以更改访问级别。 Properties -> Code -> Variable Modifiers 属性->代码->变量修饰符

Look at the properties pane, you should see the following : 查看属性窗格,您应该看到以下内容:

Properties : Binding : Events : Code 属性:绑定:事件:代码

Click on code and then variable modifiers. 单击代码,然后单击变量修饰符。 You can set the level to what you require there. 您可以将水平设置为所需的水平。

Good luck! 祝好运!

It looks like everyone is giving you the correct answer to the question you have asked... but no one is warning you that by using their answers, you are probably going to write code that violates one of your stated goals: 似乎每个人都在为您提出的问题提供正确的答案...但是没有人警告您,使用他们的答案,您可能会编写违反您设定的目标之一的代码:

Most importantly I want to separate my GUI code and non-GUI from each other. 最重要的是,我想将我的GUI代码和非GUI彼此分开。

By making the UI components more visible, you are more likely to mix your UI and non-UI logic together in your program. 通过使UI组件更加可见,您更有可能在程序中混合使用UI和非UI逻辑。

You may want to search for 'java model view controller' and read through some of the articles before you proceed. 在继续之前,您可能需要搜索“ java模型视图控制器”并通读一些文章。

Instead of instantiating a new uiFrame object I took a new JFrame. 我没有实例化一个新的uiFrame对象,而是使用了一个新的JFrame。 So it didn't have any public variable named textBox. 因此它没有任何名为textBox的公共变量。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM