Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    Settare dimensioni in componenti Swing

    ciao!

    ho qualche problema nel settare le dimensioni in alcuni componenti swing.
    non riesco bene a capire cosa mi sfugge:

    codice:
    public class MainWindow extends JFrame { 
     
        private JPanel mainPanel; 
        private JTextField txtSource; 
        private JTextField txtDestination; 
        private JButton btnStart; 
        private int generalW = 505; 
        private int generalH = 20; 
     
        public MainWindow() { 
            mainPanel = new JPanel(new BorderLayout()); 
            txtSource = new JTextField(); 
            txtSource.setPreferredSize(new Dimension(generalW, generalH)); 
            txtDestination = new JTextField(); 
            txtDestination.setPreferredSize(new Dimension(generalW, generalH)); 
            btnStart = new JButton("Start"); 
            btnStart.setPreferredSize(new Dimension(generalW, generalH)); 
     
            mainPanel.add(txtSource, BorderLayout.NORTH); 
            mainPanel.add(txtDestination, BorderLayout.CENTER); 
            mainPanel.add(btnStart, BorderLayout.SOUTH); 
     
            setLayout(new BorderLayout()); 
            getContentPane().add(mainPanel, BorderLayout.CENTER); 
     
            setPreferredSize(new Dimension(500, 100)); 
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
            setResizable(false); 
            pack(); 
            setLocationRelativeTo(null); 
        } 
    }
    in pratica le due text field e il bottone si prendono comunque le massime dimensioni possibili.
    come dovrei fare??

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Ottieni questo comportamento perché all'interno di un BorderLayout i componenti che sono nella parte NORTH e nella parte SOUTH occupano l'intera lunghezza del container, mentre in altezza prendono solo lo spazio necessario a seconda dei componenti che contengono (a meno di non aver modificato manualmente le dimensioni, cosa che in linea generale si consiglia di non fare quasi mai con il metodo setSize, e con attenzione con i vari set(Preferred|Maximum|MiniSize), visto che i vari LayoutManager possono o meno rispettarli, anche se il setPreferredSize di solito non viene ignorato).


    La parte CENTER prende invece tutto lo spazio necessario più quello "che avanza", nel senso che se la finestra cresce in lunghezza o larghezza, o se altri componenti la allungano a causa delle loro dimensioni, la parte di spazio in più finirà in CENTER.


    Nel tuo caso il mainPanel è in BorderLayout.CENTER, e non essendoci altri componenti nelle altre parti del BorderLayout mainPanel occuperà l'intera dimensione della finestra.


    A sua volta le textfield occuperanno l'intera lunghezza della finestra, come anche il bottone, e togliendo setResizable (false) (o impostando un'altezza maggiore) vedrai che la textfield al centro crescerà anche in altezza all'espandersi della finestra.


    Se vuoi fare in modo che le dimensioni dei componenti siano fisse potresti ad esempio settare un FlowLayout come layout del contentpane, così facendo mainPanel calcolerebbe la sua dimensione, ma poi all'espandersi della finestra non prenderebbe tutto lo spazio del frame.


    A seconda dell'effetto che vuoi ottenere puoi utilizzare diversi tipi di layout, eventualmente innestando i pannelli uno dentro l'altro, ma senza più informazioni non saprei che soluzione proporre ...

  3. #3
    ciao!

    grazie per l'ottima sopiegazione.

    ho optato per un flowlayout.
    per quello che devo fare basta e avanza:
    codice:
    public class MainWindow extends JFrame { 
     
        private JPanel mainPanel; 
        private JTextField txtSource; 
        private JTextField txtDestination; 
        private JButton btnStart; 
        private int generalW = 300; 
        private int generalH = 20; 
     
        public MainWindow() { 
            mainPanel = new JPanel(new BorderLayout()); 
            txtSource = new JTextField(); 
            txtSource.setPreferredSize(new Dimension(generalW, generalH)); 
            txtDestination = new JTextField(); 
            txtDestination.setPreferredSize(new Dimension(generalW, generalH)); 
            btnStart = new JButton("Start"); 
            btnStart.setPreferredSize(new Dimension(generalW, generalH)); 
     
            mainPanel.add(txtSource, BorderLayout.NORTH); 
            mainPanel.add(txtDestination, BorderLayout.CENTER); 
            mainPanel.add(btnStart, BorderLayout.SOUTH); 
     
            setLayout(new FlowLayout()); 
            getContentPane().add(mainPanel); 
     
            setPreferredSize(new Dimension(500, 100)); 
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
            setResizable(false); 
            pack(); 
            setLocationRelativeTo(null); 
        } 
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.