问题
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
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);
}
}
回答1:
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
Wide
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);
}
});
}
}
回答2:
If someone else have the same problem the solution is to use Layouts instead of using the null layout.
来源:https://stackoverflow.com/questions/9815922/resize-the-components-of-the-frame-in-full-screen-mode