Search code examples
javaswinglayoutjbuttonlayout-manager

JButton does not appear on the GUI


when I compile and run my code everything seems to work fine except the JButton does not appear. I'm adding it to a JPanel that is on the frame. I'm new so I might not know what to lookout for here. Thanks!

import java.awt.*;
import java.awt.event.*;
import java.text.*;

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;

public class TemperatureConverter extends JFrame{

    //declarations
    private JLabel celJLabel, farJLabel;

    private JTextField celJTextField, farJTextField;

    private JSlider sliderJSlider;

    private JButton closeButton;

    private TitledBorder border;

    private JPanel topPanel, bottomPanel;

    double celsiusDegrees, farenheitDegrees, sliderValue;

    DecimalFormat decimalFormat = new DecimalFormat("#.0");

    public TemperatureConverter()
    {
        createUserInterface();
    }

    public void createUserInterface()
    {
        //create the JFrame
        Container frame = getContentPane();
        frame.setBackground(Color.white);
        frame.setLayout(null);

        border = new TitledBorder("Convert between C & F");
        border.setTitleColor(Color.black);
        border.setTitleFont(new Font("Default", Font.ITALIC, 12));
        border.setTitleJustification(TitledBorder.LEFT);
        border.setTitlePosition(TitledBorder.TOP);

        topPanel = new JPanel();
        topPanel.setBounds(20,10,360,300);
        topPanel.setForeground(Color.black);
        topPanel.setBackground(Color.white);
        topPanel.setLayout(null);
        topPanel.setBorder(border);
        frame.add(topPanel);

        bottomPanel = new JPanel();
        bottomPanel.setBounds(20,310,360,50);
        bottomPanel.setForeground(Color.black);
        bottomPanel.setBackground(Color.white);
        bottomPanel.setLayout(null);
        frame.add(bottomPanel);

        celJLabel = new JLabel();
        celJLabel.setBounds(120, 200, 60, 20);
        celJLabel.setBackground(Color.white);
        celJLabel.setFont(new Font("Default", Font.PLAIN, 12));
        celJLabel.setText("Celcius");
        celJLabel.setHorizontalAlignment(JLabel.LEFT);
        topPanel.add(celJLabel);

        farJLabel = new JLabel();
        farJLabel.setBounds(120, 220, 60, 20);
        farJLabel.setBackground(Color.white);
        farJLabel.setFont(new Font("Default", Font.PLAIN, 12));
        farJLabel.setText("Faranheit");
        farJLabel.setHorizontalAlignment(JLabel.LEFT);
        topPanel.add(farJLabel);

        celJTextField = new JTextField();
        celJTextField.setBounds(195,200, 50, 15);
        celJTextField.setFont(new Font("Default", Font.PLAIN, 12));
        celJTextField.setHorizontalAlignment(JTextField.CENTER);
        celJTextField.setForeground(Color.black);
        celJTextField.setBackground(Color.white);
        topPanel.add(celJTextField);

        farJTextField = new JTextField();
        farJTextField.setBounds(195,225, 50, 15);
        farJTextField.setFont(new Font("Default", Font.PLAIN, 12));
        farJTextField.setHorizontalAlignment(JTextField.CENTER);
        farJTextField.setForeground(Color.black);
        farJTextField.setBackground(Color.white);
        topPanel.add(farJTextField);

        sliderJSlider = new JSlider(JSlider.HORIZONTAL, 0,100,0);
        sliderJSlider.setBounds(20, 20, 310, 120);
        sliderJSlider.setMajorTickSpacing(10);
        sliderJSlider.setMinorTickSpacing(5);
        sliderJSlider.setPaintTicks(true);
        sliderJSlider.setPaintLabels(true);
        sliderJSlider.setForeground(Color.black);
        sliderJSlider.setBackground(Color.white);
        topPanel.add(sliderJSlider);
        sliderJSlider.addChangeListener( 
                new ChangeListener()
                {
                    public void stateChanged(ChangeEvent event)
                    {
                        sliderStateChanged(event);
                    }       
                }

                );

        closeButton = new JButton();
        closeButton.setBounds(140, 250, 75, 20);
        closeButton.setFont(new Font("Default", Font.PLAIN,12));
        closeButton.setText("Close");
        closeButton.setForeground(Color.black);
        closeButton.setBackground(Color.white);
        bottomPanel.add(closeButton);
        closeButton.addActionListener(

            new ActionListener()
            {
                public void actionPerformed(ActionEvent event)
                {
                    closeActionPerformed(event);
                }
            }
            );

        setTitle("Temperature Converter");
        setSize(400,400);
        setVisible(true);

    }   
    public static void main(String[] args)
    {
        TemperatureConverter application = new TemperatureConverter();
        application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public void sliderStateChanged(ChangeEvent event)
    {
        farenheitDegrees = sliderJSlider.getValue();
        calculateCelsiusTemperature();

    }
    public void calculateCelsiusTemperature()
    {
        celsiusDegrees = (farenheitDegrees - 32)*5.0/9.0;
        outputTemps();
    }
    public void outputTemps()
    {
        celJTextField.setText(decimalFormat.format(celsiusDegrees));
        farJTextField.setText(decimalFormat.format(farenheitDegrees));
    }
    public void closeActionPerformed(ActionEvent event)
    {
        TemperatureConverter.this.dispose();
    }

    }

Solution

  • I'd follow the advice from the comments, use a proper layout manager.

    The actual fault, is the placement of the close button within the bottom panel.

    closeButton.setBounds(140, 250, 75, 20);
    

    This might be a typo or a misunderstanding of the coordinate system, each new panel has its own private system where (0,0) is the top left of at component. The button is at (140, 250), however bottomPanel is only 360 x 50, so it is outside the visible bounds..

    Try changing to

    closeButton.setBounds(0, 0, 75, 20);