alanazi
alanazi

Reputation: 82

Creating a window - but buttons layout error

I made a small program with two buttons. I label the buttons one exiting the program and the second importing files.

I actually let them both to exit the program when ever someone pressed on it the problem is the buttons taking all the window, why?

I tried GridBagConstraints to resize the buttons some how but no luck anyway here's the full class without imports..

public class Window2  extends JFrame{
   private static final long serialVersionUID = 1L;

   public Window2(){

       super ("ALANAZ imagtor");
       setSize(600,400);
       setDefaultCloseOperation(EXIT_ON_CLOSE);
       JPanel pnl1 = new JPanel(new GridLayout());
       JPanel pnl2 = new JPanel();

       //button
       JButton butn1 = new JButton("EXIT");
       JButton butn2 =new JButton("IMPORT");

       butn1.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            JOptionPane.showMessageDialog(null, "exiting ... bye...");
            System.exit(0);
        }
    });     
       butn2.addActionListener(new ActionListener(){

           public void actionPerformed(ActionEvent ae){
               JOptionPane.showMessageDialog(null, "can't import now exiting");
               System.exit(0);
           }
       });

       GridBagConstraints gb1 = new GridBagConstraints();
       gb1.insets = new Insets(15,15,15,15);
       //Jlabel
       JLabel lbl1 = new JLabel("exit or import an image");
       pnl1.add(butn1);
       pnl1.add(butn2);

       pnl2.add(lbl1);
       add(pnl2, BorderLayout.SOUTH);
       add(pnl1, BorderLayout.CENTER);
}}

Upvotes: 1

Views: 53

Answers (2)

Hovercraft Full Of Eels
Hovercraft Full Of Eels

Reputation: 285403

You are misusing your layout managers. Your pnl1 JPanel uses GridLayout (without any row or column constants?!), and if you only add one component to it, it will take up the entire JPanel. You seem to have GridBagConstraints in your code, but no GridBagLayout, which is confusing to me.

The solution is to read up on and understand how to use layout managers. Please have a look at the tutorial link: Laying Out Components Within a Container.

Key is to keep remembering that you can nest JPanels within JPanels. For example:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.*;

import javax.swing.*;

public class Window2 extends JFrame {
   private static final long serialVersionUID = 1L;
   private static final int PREF_W = 600;
   private static final int PREF_H = 400;

   public Window2() {

      super("ALANAZ imagtor");
      setDefaultCloseOperation(EXIT_ON_CLOSE);
      int gap = 3;
      JPanel buttonPanel = new JPanel(new GridLayout(1, 0, gap, 0));
      buttonPanel.setBorder(BorderFactory.createEmptyBorder(gap, gap, gap, gap));
      JPanel pnl2 = new JPanel();

      JButton butn1 = new JButton("EXIT");
      JButton butn2 = new JButton("IMPORT");

      butn1.addActionListener(new ActionListener() {

         @Override
         public void actionPerformed(ActionEvent e) {
            JOptionPane.showMessageDialog(null, "exiting ... bye...");
            System.exit(0);
         }
      });
      butn2.addActionListener(new ActionListener() {

         public void actionPerformed(ActionEvent ae) {
            JOptionPane.showMessageDialog(null, "can't import now exiting");
            System.exit(0);
         }
      });

      JLabel lbl1 = new JLabel("exit or import an image");
      buttonPanel.add(butn1);
      buttonPanel.add(butn2);


      JPanel centerPanel = new JPanel(new BorderLayout());
      centerPanel.add(buttonPanel, BorderLayout.SOUTH);

      pnl2.add(lbl1);
      add(pnl2, BorderLayout.SOUTH);
      add(centerPanel, BorderLayout.CENTER);
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }

   public static void main(String[] args) {
      Window2 win2 = new Window2();
      win2.pack();
      win2.setLocationRelativeTo(null);
      win2.setVisible(true);
   }
}

Upvotes: 3

Daniel Mac
Daniel Mac

Reputation: 382

If you initialize your panel with a BorderLayout instead, and add your buttons using EAST, NORTH, WEST, SOUTH, you will have a quick fix - however I do also recommend reading up on layout managers

JPanel pnl1 = new JPanel(new BorderLayout());
pnl1.add(new JButton(), BorderLayout.SOUTH);   

Upvotes: 1

Related Questions