Question

I'm using some sample code from the Java website, and the file selector seems to get the file I want, but when I try to update the jframe and other components in the gui I used to call the file selector, nothing changes. I've tried quite a few of the suggested fixes to get things to update, but nothing seems to work. Most of my components are static by the way...

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import javax.swing.*;
import java.awt.*;
import java.io.File;
import java.awt.event.*;

public class GuiTester extends JFrame {

    private static String fileName = "Input File: Please select a file";
    //Create a file chooser
    private static final JFileChooser fc = new JFileChooser();
    private static JButton inputSelectorButton;
    private static JButton outputSelectorButton;
    private static JFrame frame = new JFrame( "Gui Tester" );
    private static JPanel panel = new JPanel();
    private static JLabel inputFile = new JLabel( fileName );


    public static void main(String[] args) {
        go();
    }


    private static void go() {
        inputSelectorButton = new JButton ( "Select Input File" );
        outputSelectorButton = new JButton ( "Select Output File" );
        Font bigFont = new Font( "sans", Font.BOLD, 22 );
        Font smallFont = new Font( "sans", Font.PLAIN, 9 );
        panel.setLayout(new BoxLayout( panel, BoxLayout.Y_AXIS ) );
        JLabel description0 = new JLabel(" ");        
        JLabel description6 = new JLabel(" ");
        JLabel inputFile = new JLabel( fileName );
        inputFile.setFont( smallFont );
        inputSelectorButton.addActionListener( new inputSelectorListener() );
        JButton startButton = new JButton ( "GO!" );

        panel.add(description0);
        panel.add(description6);
        panel.add( inputFile );
        panel.add( inputSelectorButton );
        panel.add( outputSelectorButton );
        panel.add( startButton );

        frame.getContentPane().add( BorderLayout.CENTER, panel );
        inputFile.setAlignmentX(JComponent.CENTER_ALIGNMENT);
        inputSelectorButton.setAlignmentX(JComponent.CENTER_ALIGNMENT);
        outputSelectorButton.setAlignmentX(JComponent.CENTER_ALIGNMENT);
        startButton.setAlignmentX(JComponent.CENTER_ALIGNMENT);
        frame.setSize(370,400);
        panel.setSize(370,400);

        frame.setVisible(true);
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    }


    public static class inputSelectorListener implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == inputSelectorButton) {
                int returnVal = fc.showOpenDialog( panel );

                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    File file = fc.getSelectedFile();
                    if ( file.exists() )
                        fileName = file.getPath();
                    else
                        fileName = "File not found, please select a file";
                    System.out.println(fileName);
                    inputFile.setText( fileName );
                    inputFile.validate();
                    inputFile.repaint();
                    panel.validate();
                    panel.repaint();
                    frame.validate();
                    frame.repaint();
                } else {
                    System.out.println("Open command cancelled by user.");
                }
            }
        }
    }

}
Was it helpful?

Solution

I do not see anywhere you add

  • inputFile
  • panel

To anything that is displayable.

You are also shadowing inputFile.

You create an static reference...

private static JLabel inputFile = new JLabel(fileName);

Then in go, you create a local reference...

JLabel inputFile = new JLabel(fileName);

This means that the reference you using in the actionPerformed method is not the same reference that is on the screen.

Do not rely on static to solve reference issues, this will bite you more quickly then you can realise...

You might like to take a look at:

OTHER TIPS

You should try to use classes and organize your code better. Below I have redesigned your existing code. I did not add anything, but I did move some stuff around and remove a couple unnecessary variables for this example.

I changed your ActionListener to an AbstractAction, just to let you know. :-p

import java.awt.Container;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.io.File;

import javax.swing.AbstractAction;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

@SuppressWarnings("serial")
public class GuiTester extends JPanel {

    // Create a file chooser
    private static final JFileChooser fc = new JFileChooser();

    private JLabel inputFile;

    public GuiTester(int width, int height) {
        Font smallFont = new Font("sans", Font.PLAIN, 9);
        JLabel description0 = new JLabel(" ");
        JLabel description6 = new JLabel(" ");
        JButton startButton = new JButton("Enter");
        JButton inputSelectorButton = new JButton(new FileChooserAction(
                "Select Input File"));
        JButton outputSelectorButton = new JButton("Select Output File");

        inputFile = new JLabel("Input File: Please select a file");
        inputFile.setFont(smallFont);

        inputFile.setAlignmentX(JComponent.CENTER_ALIGNMENT);
        inputSelectorButton.setAlignmentX(JComponent.CENTER_ALIGNMENT);
        outputSelectorButton.setAlignmentX(JComponent.CENTER_ALIGNMENT);
        startButton.setAlignmentX(JComponent.CENTER_ALIGNMENT);

        add(description0);
        add(description6);
        add(inputFile);
        add(inputSelectorButton);
        add(outputSelectorButton);
        add(startButton);

        setSize(width, height);
        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
    }

    public JLabel getInputFileLabel() {
        return inputFile;
    }

    @Override
    public void invalidate() {
        super.invalidate();

        // Invalidate the label, you really don't need this, but you should
        // reference children in here if you want to explicitly invalidate them
        // when the parent gets invalidated. The parent is responsible for
        // telling its children what to do and when to do it.
        inputFile.invalidate();
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        // This gets called when you repaint, since you are adding children
        // to this panel, painting is pointless. You can however fill the
        // background if you wish.
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame f = new JFrame("Gui Test");

                f.setContentPane(new GuiTester(370, 400));
                f.setSize(370, 400);
                f.setVisible(true);
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setLocationRelativeTo(null);
            }
        });
    }

    public class FileChooserAction extends AbstractAction {
        public FileChooserAction(String name) {
            super(name);
        }

        public void actionPerformed(ActionEvent e) {
            Container c = ((JButton) e.getSource()).getParent();
            GuiTester g = null;

            if (c instanceof GuiTester) {
                g = (GuiTester) c;
            }

            int returnVal = fc.showOpenDialog(c);

            if (g != null && returnVal == JFileChooser.APPROVE_OPTION) {
                File file = fc.getSelectedFile();
                String fileName = "Input File: Please select a file";

                if (file.exists())
                    fileName = file.getPath();
                else
                    fileName = "File not found, please select a file";

                System.out.println(fileName);

                g.getInputFileLabel().setText(fileName);

                g.validate();
                g.repaint();
            } else {
                System.out.println("Open command cancelled by user.");
            }
        }
    }
} 
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top