Question

I am writing a swing program. But the problem is that the JButton I want to be small. It should be up to me to decide its height and width but the code below creates a long horizontal button.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class SwingExample 
{
         //Create the GUI and show it. For thread safety, this method should be
        //invoked from the event-dispatching thread

        private static void createAndShowGUI()
        {
            //create and setup the window
            JFrame frame=new JFrame("Swing Demo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            //Set the size of the window
            frame.setPreferredSize(new Dimension(300,300));            


            //Centre the window on the screen
            WinUtilities wu=new WinUtilities();
            wu.centerWindow(frame);

            //Create a panel
            JPanel panel=new JPanel(new BorderLayout());

            //Create three buttons

                //Button1
                    JButton But1=new JButton("Add");
                    But1.setText("Add Data");
                    But1.setSize(new Dimension(10,20)); //Using it has no effect
                    But1.setMnemonic('A');
                    But1.setMargin(new Insets(12,7,20,10)); //Using it has no effect
                    But1.setBorder(null); //Using it has no effect
                    panel.add(But1,BorderLayout.WEST);

                //Button2
                    JButton But2=new JButton("Edit");
                    But2.setText("Edit Data");
                    But2.setMnemonic(KeyEvent.VK_E);
                    But2.setPreferredSize(new Dimension(5,5));

                    panel.add(But2,BorderLayout.CENTER);

               //Button3
                    JButton But3=new JButton("Display");
                    But3.setText("Display Data");
                    But3.setMnemonic(KeyEvent.VK_D);
                    But3.setPreferredSize(new Dimension(5,5));
                    panel.add(But3,BorderLayout.EAST);


            //Set window characteristics
            frame.setContentPane(panel);
            //frame.add(panel);
            frame.pack();



            //Display the window
            frame.setVisible(true);
        }

        public static void main(String args[])
        {
            //Schedule a job for the event dispatching thread

            //creating and showing this application's GUI
            javax.swing.SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {
                    createAndShowGUI();
                }
            });

        }
}

class WinUtilities
{
    public void centerWindow(JFrame frm)
    {
        frm.setLocationRelativeTo(null);
    }
}

Please Help

Was it helpful?

Solution

for example

enter image description here

suggestion

  • JPanel has implemented in API FlowLayout (pretty accepting PreferredSize),

  • then BoderLayout could be wrong LayoutManager,

  • or to use GridLayout (then all JButtons will be have the same size, based on largest Item)

code

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class SwingExample {

    private static void createAndShowGUI() {
        JFrame frame = new JFrame("Swing Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel();
        JButton but1 = new JButton("Add");
        but1.setText("Add Data");
        but1.setMnemonic('A');
        but1.setBorderPainted(false);
        but1.setBackground(Color.red);
        but1.setBorder(null);
        but1.setFocusable(false);
        but1.setMargin(new Insets(0, 0, 0, 0));
        //but1.setContentAreaFilled(false);
        panel.add(but1);
        JButton but2 = new JButton("Edit");
        but2.setText("Edit Data");
        but2.setMnemonic(KeyEvent.VK_E);
        panel.add(but2);
        JButton but3 = new JButton("Display");
        but3.setText("Display Data");
        but3.setMnemonic(KeyEvent.VK_D);
        panel.add(but3);
        frame.add(panel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String args[]) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                createAndShowGUI();
            }
        });
    }
}

OTHER TIPS

Buttons are big, because:

  • you've set frame's preferred size to 300x300
  • you've set content's layout to BorderLayout
  • buttons were enlarged to fit so big frame

Simply delete the frame.setPreferredSize() and the buttons will be small (the frame size will be determined by the preferred sizes of inner components by calling frame.pack() method).

By the way:

  • the But1.setSize(...); was ignored - you should always call: setMinimumSize/setMaximumSize/setPreferredSize instead, the layout determines the sizes according to constraints
  • it's very unlikely to display texts: 'Edit data', 'Add data' correctly on buttons with preferred size 5x5, consider using icons or make the buttons bigger
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top