Le posizioni e le dimensioni di JPanel cambiano in base alla schermata

Il programma viene eseguito con le sue dimensioni in base alla risoluzione dello schermo o alle dimensioni del computer. Quando lo eseguo su un computer con dimensioni specifiche del suo monitor, cambierà di conseguenza. Il mio problema è il posizionamento e la dimensione di un JPanel, o qualsiasi object all’interno del frame, da adottare sul cambio di dimensione dello schermo.

Quindi ogni volta che presenterò il mio programma su qualsiasi monitor con dimensioni diverse, i componenti saranno ancora organizzati e posizionati come quello che ho progettato in origine. Ma qui lo sto testando con un JPanel chiamato displayMenu. In cui visualizza un pannello colorato in verde.

package saves.project; import com.sun.awt.AWTUtilities; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; import javax.swing.*; import javax.swing.border.*; import javax.swing.BorderFactory; import javax.imageio.ImageIO; public class Homepage extends JFrame{ Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Border grayline = BorderFactory.createLineBorder(Color.GRAY);; int width = screenSize.width, height = screenSize.height; public Homepage() throws IOException{ super("Homepage"); displayMenu(); displayBackground(); } public static BufferedImage resize(BufferedImage image, int width, int height) { BufferedImage bi = new BufferedImage(width, height, BufferedImage.TRANSLUCENT); Graphics2D g2d = (Graphics2D) bi.createGraphics(); g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY)); g2d.drawImage(image, 0, 0, width, height, null); g2d.dispose(); return bi; } public void displayBackground() throws IOException{ JPanel pBackground = new JPanel(); pBackground.setSize(screenSize); pBackground.setLayout(new FlowLayout()); add(pBackground); BufferedImage header = ImageIO.read(new File("res\\bg.jpg")); BufferedImage resizedImage = resize(header,width,height); ImageIcon image = new ImageIcon(resizedImage); JLabel lblheader = new JLabel(image, JLabel.CENTER); pBackground.add(lblheader); } public void displayMenu() { JPanel pTitle = new JPanel(); pTitle.setLayout(null); pTitle.setBounds(width/3, (height/2)+20, width/2, height/2); pTitle.setBackground(Color.GREEN); add(pTitle); } public void CreateAndShowGUI() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setExtendedState(JFrame.MAXIMIZED_BOTH); setUndecorated(true); setVisible(true); } } 

Inoltre, sembra che il mio background non sia stato completamente diffuso in tutto il fotogramma. C’è una linea bianca in alto ma il resto è lo sfondo. Cosa dovrei fare? Grazie per l’aiuto!

Seguito con il commento di @MadProgrammer:

Hai davvero bisogno di imparare come usare i gestori di layout. L’impostazione delle dimensioni non è la strada da percorrere, poiché le prestazioni saranno diverse su macchine diverse.

Una cosa importante da sapere sui gestori di layout sono i layout che rispettano le dimensioni preferite dei componenti interni. Quelli che non rispettano le dimensioni, allungheranno i componenti. Alcuni layout potrebbero non allungare i loro componenti, ma li posizioneranno in una posizione predefinita all’interno dello spazio aperto, quando il contenitore principale viene allungato.

Per ottenere i risultati desiderati, talvolta è anche necessario nidificare contenitori con layout diversi, sfruttando due o più layout.

So che questa non è una gran bella risposta alla tua domanda, ma ho pensato che potresti ancora ottenere una visione del tuo problema, e come puoi ottenere ciò che stai cercando, con l’uso di Layout Manager.

Di seguito ho appena fatto un rapido esempio delle diverse nature di alcuni dei principali gestori di layout. Puoi giocare con esso. Nota che JFrame principale sta utilizzando il BorderLayout predefinito. Ho impostato il layout solo in modo esplicito come BorderLayout modo da poter vedere quale layout causa l’effetto.

Dai un’occhiata a Laying out Components Withing Container per saperne di più su come usare diversi Layout Manager. Evita di usare i layout nulli e prova a posizionare tutto da solo. Lascia che i layout lo facciano per te, dato che Swing è stato creato per essere utilizzato con i gestori di layout.


inserisci la descrizione dell'immagine qui

 import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.GridBagLayout; import java.awt.GridLayout; import javax.swing.*; public class TestingLayoutManagers { private JPanel northFlowLayoutPanel; private JPanel southBorderLayoutPanel; private JPanel centerGridBagLayoutPanel; private JPanel westBoxLayoutPanel; private JPanel eastGridLayoutPanel; private final JButton northButton = new JButton("North Button"); private final JButton southButton = new JButton("South Button"); private final JButton centerButton = new JButton("Center Button"); private final JButton eastButton = new JButton("East Button"); private final JButton menuButton1 = new JButton("Menu Item 1"); private final JButton menuButton2 = new JButton("Menu Item 2"); private final JButton menuButton3 = new JButton("Menu Item 3"); private final JButton menuButton4 = new JButton("Menu Item 4"); private final JButton menuButton5 = new JButton("Menu Item 5"); public TestingLayoutManagers() { northFlowLayoutPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); southBorderLayoutPanel = new JPanel(new BorderLayout()); centerGridBagLayoutPanel = new JPanel(new GridBagLayout()); eastGridLayoutPanel = new JPanel(new GridLayout(1, 1)); Box box = Box.createVerticalBox(); westBoxLayoutPanel = new JPanel(); northFlowLayoutPanel.add(northButton); northFlowLayoutPanel.setBorder(BorderFactory.createTitledBorder("Flow Layout")); southBorderLayoutPanel.add(southButton); southBorderLayoutPanel.setBorder(BorderFactory.createTitledBorder("Border Layout")); centerGridBagLayoutPanel.add(centerButton); centerGridBagLayoutPanel.setBorder(BorderFactory.createTitledBorder("GridBag Layout")); eastGridLayoutPanel.add(eastButton); eastGridLayoutPanel.setBorder(BorderFactory.createTitledBorder("Grid Layout")); box.add(menuButton1); box.add(menuButton2); box.add(menuButton3); box.add(menuButton4); box.add(menuButton5); westBoxLayoutPanel.add(box); westBoxLayoutPanel.setBorder(BorderFactory.createTitledBorder("Box Layout")); JFrame frame = new JFrame("Test Layout Managers"); frame.setLayout(new BorderLayout()); // This is the deafault layout frame.add(northFlowLayoutPanel, BorderLayout.PAGE_START); frame.add(southBorderLayoutPanel, BorderLayout.PAGE_END); frame.add(centerGridBagLayoutPanel, BorderLayout.CENTER); frame.add(eastGridLayoutPanel, BorderLayout.LINE_END); frame.add(westBoxLayoutPanel, BorderLayout.LINE_START); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); frame.setExtendedState(JFrame.MAXIMIZED_BOTH); } public static void main(String[] args) { SwingUtilities.invokeLater(() -> { try { UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) { e.printStackTrace(); } new TestingLayoutManagers(); }); } }