4

I want my frame components to be always adjusted in the screen, regardless of screen size. I draw the frame in my Laptop (small screen) and when I run my application in another machine (jar file) with a big screen the frame components doesn't re-size!

How I can make my frame resize it's components when I put the frame in full-screen mode in any machine?

Current layout

MSM GUI

Code

package package_MSM;

import java.awt.Color;

public class MSMGui extends JFrame 
{
    private static final long serialVersionUID = 1L;
    private JPanel contentPane;
    private JTextArea textArea;
    private JPanel pnlLogo1;
    private JLabel lblLogo1;;
    private static JButton btnSmpd1;
    private static JButton btnSmpd2;
    private static JButton btnSmpd3;
    private static JButton btnSmpd4;
    private static JButton btnSmpd5;
    private static JButton btnSmpd6;
    private static JButton btnSmpd7;

    /**
     * Launch the application.
     */

    public static void main(String[] args) 
    {
        EventQueue.invokeLater(new Runnable() 
        {
            public void run() 
            {
                try 
                {
                    MSMGui frame = new MSMGui();
                    frame.setExtendedState(Frame.MAXIMIZED_BOTH);
                    frame.setVisible(true);
                    
                } 
                catch (Exception e) 
                {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public MSMGui() 
    {
        setResizable(true);
        setTitle("MSM");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 841, 334);
        contentPane = new JPanel();
        contentPane.setBackground(Color.BLACK);
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
        
        JPanel panelSmpd = new JPanel();
        panelSmpd.setBounds(10, 69, 804, 105);
        panelSmpd.setBackground(Color.BLACK);
        contentPane.add(panelSmpd);
        panelSmpd.setLayout(null);
        
        JMenuBar menuBar = new JMenuBar();
        menuBar.setBackground(UIManager.getColor("MenuBar.background"));
        menuBar.setFont(new Font("Segoe UI", Font.PLAIN, 12));
        setJMenuBar(menuBar);
        
        JMenu mnMenu = new JMenu("Menu");
        menuBar.add(mnMenu);
                    
        JMenuItem mntmAlarmStop = new JMenuItem("Stop alarm sound");
        mntmAlarmStop.addActionListener(new ActionListener() 
        {
            public void actionPerformed(ActionEvent e) 
            {
                stopAlarm();
                textArea.append(dateTime()+ " Alarm cleared by the Operator from the Menu Bar\n");
                writeTofile(dateTime()+ " Alarm cleared by the Operator from the Menu Bar\n");
            }
        });
        mnMenu.add(mntmAlarmStop);

        JMenuItem mntmExit = new JMenuItem("Exit");
        mntmExit.addActionListener(new ActionListener() 
        {
            public void actionPerformed(ActionEvent e) 
            {
                // display the showOptionDialog
                Object[] options = { "OK", "Cancel" };
                int choice = JOptionPane.showOptionDialog(null, 
                                        "You really want to quit?", 
                                        "Quit?", 
                                        JOptionPane.YES_NO_OPTION, 
                                        JOptionPane.QUESTION_MESSAGE, 
                                        null, 
                                        options, 
                                        options[0]);

                // interpret the user's choice
                if (choice == JOptionPane.YES_OPTION)
                {
                    System.exit(0);
                }
            }
        });
        mnMenu.add(mntmExit);       
        
        btnSmpd1 = new JButton("SPD 1");
        btnSmpd1.addActionListener(new ActionListener() 
        {
            public void actionPerformed(ActionEvent arg0) 
            {               
                btnSmpd1.setBackground(Color.YELLOW);
                stopAlarm();
                btnSmpd1.setEnabled(false);
                textArea.append(dateTime() + " Alarm Stampede 1 cleared by the Operator\n");
                writeTofile(dateTime()  + " Alarm Stampede 1 cleared by the Operator\n");
            }
        });
        btnSmpd1.setFont(new Font("Tahoma", Font.BOLD, 15));
        btnSmpd1.setBounds(23, 13, 100, 74);
        panelSmpd.add(btnSmpd1);
        btnSmpd1.setOpaque(true);
        
        btnSmpd2 = new JButton("SPD 2");
        btnSmpd2.addActionListener(new ActionListener() 
        {
            public void actionPerformed(ActionEvent arg0) 
            {               
                btnSmpd2.setBackground(Color.YELLOW);
                stopAlarm();
                btnSmpd2.setEnabled(false);
                textArea.append(dateTime() + " Alarm Stampede 2 cleared by the Operator\n");
                writeTofile(dateTime()  + " Alarm Stampede 2 cleared by the Operator\n");
            }
        });
        btnSmpd2.setFont(new Font("Tahoma", Font.BOLD, 15));
        btnSmpd2.setBounds(133, 13, 100, 74);
        panelSmpd.add(btnSmpd2);
        btnSmpd2.setOpaque(true);
        
        btnSmpd3 = new JButton("SPD 3");
        btnSmpd3.addActionListener(new ActionListener() 
        {
            public void actionPerformed(ActionEvent arg0) 
            {
                btnSmpd3.setBackground(Color.YELLOW);
                stopAlarm();
                btnSmpd3.setEnabled(false);
                textArea.append(dateTime() + " Alarm Stampede 3 cleared by the Operator\n");
                writeTofile(dateTime()  + " Alarm Stampede 3 cleared by the Operator\n");
            }
        });
        btnSmpd3.setFont(new Font("Tahoma", Font.BOLD, 15));
        btnSmpd3.setBounds(243, 13, 100, 74);
        panelSmpd.add(btnSmpd3);
        btnSmpd3.setOpaque(true);
        
        btnSmpd4 = new JButton("SPD 4");
        btnSmpd4.addActionListener(new ActionListener() 
        {
            public void actionPerformed(ActionEvent arg0) 
            {
                btnSmpd4.setBackground(Color.YELLOW);
                stopAlarm();
                btnSmpd4.setEnabled(false);
                textArea.append(dateTime() + " Alarm Stampede 4 cleared by the Operator\n");
                writeTofile(dateTime()  + " Alarm Stampede 4 cleared by the Operator\n");
            }
        });
        btnSmpd4.setFont(new Font("Tahoma", Font.BOLD, 15));
        btnSmpd4.setBounds(353, 13, 100, 74);
        panelSmpd.add(btnSmpd4);
        btnSmpd4.setOpaque(true);
        
        btnSmpd5 = new JButton("SPD 5");
        btnSmpd5.addActionListener(new ActionListener() 
        {
            public void actionPerformed(ActionEvent arg0) 
            {               
                btnSmpd5.setBackground(Color.YELLOW);
                stopAlarm();
                btnSmpd5.setEnabled(false);
                textArea.append(dateTime() + " Alarm Stampede 5 cleared by the Operator\n");
                writeTofile(dateTime()  + " Alarm Stampede 5 cleared by the Operator\n");
            }
        });
        btnSmpd5.setFont(new Font("Tahoma", Font.BOLD, 15));
        btnSmpd5.setBounds(463, 11, 100, 76);
        panelSmpd.add(btnSmpd5);
        btnSmpd5.setOpaque(true);
        
        btnSmpd6 = new JButton("SPD 6");
        btnSmpd6.addActionListener(new ActionListener() 
        {
            public void actionPerformed(ActionEvent arg0) 
            {               
                btnSmpd6.setBackground(Color.YELLOW);
                stopAlarm();
                btnSmpd6.setEnabled(false);
                textArea.append(dateTime() + " Alarm Stampede 6 cleared by the Operator\n");
                writeTofile(dateTime()  + " Alarm Stampede 6 cleared by the Operator\n");
            }
        });
        btnSmpd6.setFont(new Font("Tahoma", Font.BOLD, 15));
        btnSmpd6.setBounds(573, 11, 100, 76);
        panelSmpd.add(btnSmpd6);
        btnSmpd6.setOpaque(true);
        
        btnSmpd7 = new JButton("SPD 7");
        btnSmpd7.addActionListener(new ActionListener() 
        {
            public void actionPerformed(ActionEvent arg0) 
            {               
                btnSmpd7.setBackground(Color.YELLOW);
                stopAlarm();
                btnSmpd7.setEnabled(false);
                textArea.append(dateTime() + " Alarm Stampede 7 cleared by the Operator\n");
                writeTofile(dateTime()  + " Alarm Stampede 7 cleared by the Operator\n");
            }
        });
        btnSmpd7.setFont(new Font("Tahoma", Font.BOLD, 15));
        btnSmpd7.setBounds(683, 11, 100, 76);
        panelSmpd.add(btnSmpd7);
        btnSmpd7.setOpaque(true);
        
        JLabel lblTitle = new JLabel("MNOC Stampede Monitor");
        lblTitle.setBounds(200, 11, 423, 27);
        lblTitle.setHorizontalTextPosition(SwingConstants.CENTER);
        lblTitle.setForeground(Color.GRAY);
        lblTitle.setHorizontalAlignment(SwingConstants.CENTER);
        lblTitle.setFont(new Font("Tahoma", Font.BOLD, 32));
        contentPane.add(lblTitle);
        
        scrollPane = new JScrollPane();
        scrollPane.setBounds(40, 172, 754, 91);
        contentPane.add(scrollPane);
        
        textArea = new JTextArea();
        scrollPane.setViewportView(textArea);
        
        ImageIcon image = new ImageIcon("logo.jpg");
        
        pnlLogo1 = new JPanel();
        pnlLogo1.setBounds(50, 11, 70, 47);
        contentPane.add(pnlLogo1);
        pnlLogo1.setLayout(null);
        lblLogo1 = new JLabel();
        lblLogo1.setBounds(0, 0, 70, 47);
        pnlLogo1.add(lblLogo1);
        lblLogo1.setOpaque(true);
        lblLogo1.setVisible(true);
        lblLogo1.setIcon(image);
        pnlLogo1.setVisible(true);
    }
}
Community
  • 1
  • 1
Abs
  • 111
  • 1
  • 2
  • 13
  • We need to know _much_ more about your application's content and what part needs to scale. Please edit your question to include an [sscce](http://sscce.org/) that illustrates your principal goal. – trashgod Mar 22 '12 at 05:07
  • I'd edited my text in added the code source. Need that components in the frame to be resized when I maximize the frame. The problem is I can maximize the frame but its components still small. – Abs Mar 22 '12 at 05:38
  • 1
    @Abs : You need to use `LayoutManager` to position your components on the `JFrame/JPanel`, as adviced by Andrew in his answer. Don't use null Layout, that is the real cause of this thing, what you are facing :-) – nIcE cOw Mar 22 '12 at 06:39
  • BTW - Most people feel an S-SCCE should be less than 241 lines of code. Get it resizing with just two components in the GUI, **then** proceed to longer code! – Andrew Thompson Mar 22 '12 at 06:48
  • Woops! I spoke too soon, that 241 lines of code dump is not even compilable. Please follow the link in the 1st comment, read it, & *post an SSCCE!* – Andrew Thompson Mar 22 '12 at 06:52
  • Worse of all the import for `javax.swing.*;` is missing :-) . Where is `dateTime()` function ? – nIcE cOw Mar 22 '12 at 07:08
  • Thanks to all. My problem was that I'm using the null Layout. Now I'm trying to redraw my components with LayoutManager. – Abs Mar 22 '12 at 23:15

2 Answers2

9

See Laying Out Components Within a Container.


OK, I hacked out some code in the shape of your original GUI that uses layouts and will resize. Since I was not clear on where the extra height should be assigned, I gave it to the text area. Colors, font size etc. are left as an exercise for the user.

Screenshots

Small

StampedeMonitor - small

Wide

StampedeMonitor - wide

Tall

StampedeMonitor - tall

SSCCE

package test;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;

public class StampedeMonitor {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame f = new JFrame("MSM");
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                
                JPanel gui = new JPanel(new BorderLayout(5,5));
                gui.setBorder(new EmptyBorder(10,10,10,10));
                
                JPanel logos = new JPanel(new BorderLayout(5,5));
                gui.add(logos, BorderLayout.NORTH);
                JPanel icon = new JPanel();
                // this should be set by the image
                icon.setPreferredSize(new Dimension(50,50));
                icon.setBackground(Color.RED);
                icon.setOpaque(true);
                logos.add(icon, BorderLayout.WEST);
                logos.add(new JLabel("MNOC Stampede Monitor", JLabel.CENTER));
                
                JPanel controls = new JPanel(new BorderLayout(5,5));
                gui.add(controls, BorderLayout.CENTER);
                JPanel buttons = new JPanel(new GridLayout(1,0,5,5));
                controls.add(buttons, BorderLayout.NORTH);
                for (int ii=1; ii<8; ii++) {
                    JButton button = new JButton("SPD " + ii);
                    Dimension d = button.getPreferredSize();
                    // make the buttons twice as tall as default
                    Dimension big = new Dimension(
                            (int)d.getWidth(),
                            (int)d.getHeight()*2);
                    button.setPreferredSize(big);
                    buttons.add(button);
                }
                controls.add(new JScrollPane( new JTextArea(5,10) ));
                                
                f.setContentPane(gui);
                f.pack();
                f.setVisible(true);
            }
        });
    }
}
Community
  • 1
  • 1
Andrew Thompson
  • 168,117
  • 40
  • 217
  • 433
  • 1
    This is essential; for example, [`FullScreenTest `](http://stackoverflow.com/a/7457102/230513) relies the `JPanel` default, `FlowLayout`. – trashgod Mar 22 '12 at 05:03
  • 1
    Exemplary; in case the title label is meant to scale, @mKorbel has collected related examples [here](http://stackoverflow.com/a/9815307/230513). – trashgod Mar 22 '12 at 11:21
  • @trashgod That is a nice collection of examples of scaling text to fit. – Andrew Thompson Mar 22 '12 at 11:25
  • Thanks Andrew. The problem is the null Layout. There is no way to draw the components without following the LayoutManager ? it take a lot of time this why I used the Absolute Layoute (null). – Abs Mar 22 '12 at 23:20
  • I'm using Eclipse with windowsBuilderPro. – Abs Mar 23 '12 at 00:25
  • *"it take a lot of time this why I used the Absolute Layoute (null)."* And it failed. It would take you a great deal of time to get it working, longer than to learn (and use) layouts. Further, you would then be spending that 'long time to get null layout working' in every subsequent GUI. It did not take me long to produce that layout. – Andrew Thompson Mar 23 '12 at 08:02
  • You are wright. OK I used the layouts now in another projects and I'm happy all components resize in full screen mode. Thanks again. – Abs Mar 24 '12 at 06:30
2

If someone else have the same problem the solution is to use Layouts instead of using the null layout.

Abs
  • 111
  • 1
  • 2
  • 13