tags:

views:

224

answers:

4

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. I could not change it to public. So, all the components are accessible only to the class containing the 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.

I can copy paste the GUI code and later make them public by hand to achieve what I want. But thats a pain. I have to handcraft a portion whenever I need to re-design the 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? I think I need the component generated in a public method as well.

I am new to Java. Any helps?

Here's the sample classes:

The UI (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)

package barcode;


import javax.swing.JFrame;


public class Main {

    public static void main(String[] args) {

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




    }


}
+1  A: 

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!

Madabitjer
A: 

When you click any component in GUI Builder you can change access level. Properties -> Code -> Variable Modifiers

den bardadym
Even if I make those variables public, they will be generated inside a private method. So, I won't be able to access them from other classes. I think what I really need is to make the initComponents() public. Am I missing something?
maSnun
den bardadym
the variables are declared in the class, so they are accessible from anywhere if you declare them public. They are initialized in the private method initComponents()... and that does not affect their visibility (or scope).
vkraemer
yes, of course!!!)
den bardadym
Now i dont undestand what author want...
den bardadym
I want to change the value of the textBox text field declared in uiFrame.java from Main.java.I got what what I missed. I instantiated a JFrame rather than uiFrame object in the Main.java class. Thats why there was no symbol named textBox in a JFrame. Sorry for bothering you people and wasting your time.Thanks for the help, thanks a lot.
maSnun
A: 

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.

By making the UI components more visible, you are more likely to mix your UI and non-UI logic together in your program.

You may want to search for 'java model view controller' and read through some of the articles before you proceed.

vkraemer
A: 

Sorry people, I am new to Java. Instead of instantiating a new uiFrame object I took a new JFrame. So it didn't have any public variable named textBox. Sorry for wasting your time. And thanks for the help.

maSnun