javaswingjtextfieldboxlayout

Set size of JTextField with BoyLayout Manager. Java


I have seen this question been answered. but not for BoxLayout. I have created a schedule app in Java and because I want to display every hour under each other, I have chosen BoxLayout. When every hour is displayed, everything looks perfect. However, before my method is called by clicking a button, the JTextField just takes up the whole screen (with the button). How do I make that different?

Main class:

public class Main {
    
    public static void main(String[] args) {
    JFrame window = new JFrame();
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setResizable(true);
                
    GamePanel gamepanel = new GamePanel();
    
    window.add(gamepanel);
    
    window.pack();
            
    window.setLocationRelativeTo(null);
    window.setVisible(true)
    
    }
}

GamePanel Class:

public class GamePanel extends JPanel implements ActionListener {
    
    //Screen Settings
    final int originalTileSize = 16;
    final int scale = 3;
    final int tileSize = originalTileSize * scale;
    final int maxScreenCol = 16;
    final int maxScreenRow = 12;
    final int screenWidth = tileSize * maxScreenCol;
    final int screenHeight = tileSize * maxScreenRow;
    
    //Initialize the things that are displayed
    JButton knopf;
    JTextField field;
    Tage days; 
    String textInhalt;
    static JLabel displayIsSchool;
    static JLabel stunden;
    static JLabel stunden1;
    static JLabel stunden2;
    static JLabel stunden3;
    static JLabel stunden4;
    static JLabel stunden5;
    static JLabel stunden6;
    static JLabel stunden7;
    static JLabel stunden8;
    
        //Panel constructor
        public GamePanel(){
            
            super();
            this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
            
            //JFrame stats
            this.setPreferredSize(new Dimension(screenWidth, screenHeight));
            this.setBackground(Color.darkGray);
            this.setDoubleBuffered(true);
            this.setFocusable(true);
            
            //Initialize Text field 
            field = new JTextField();
            field.setFont(new Font("Serif",Font.BOLD,30));
            field.setPreferredSize(new Dimension (100, 50));
            
            //Initialize Button 
            knopf = new JButton("klick");
            knopf.addActionListener(this);
            knopf.setPreferredSize(new Dimension (100, 35));
            
            //Initialize isSchool
            displayIsSchool = new JLabel("");
            displayIsSchool.setForeground(Color.white);
            displayIsSchool.setFont(new Font("Serif",Font.BOLD,30));
        
            //Initialize stunden
            stunden = new JLabel("");
            stunden.setForeground(Color.white);
            stunden.setFont(new Font("Serif",Font.BOLD,30));
            
            stunden1 = new JLabel("");
            stunden1.setForeground(Color.white);
            stunden1.setFont(new Font("Serif",Font.BOLD,30));
        
            stunden2 = new JLabel("");
            stunden2.setForeground(Color.white);
            stunden2.setFont(new Font("Serif",Font.BOLD,30));
        
            stunden3 = new JLabel("");
            stunden3.setForeground(Color.white);
            stunden3.setFont(new Font("Serif",Font.BOLD,30));
        
            stunden4 = new JLabel("");
            stunden4.setForeground(Color.white);
            stunden4.setFont(new Font("Serif",Font.BOLD,30));
        
            stunden5 = new JLabel("");
            stunden5.setForeground(Color.white);
            stunden5.setFont(new Font("Serif",Font.BOLD,30));
        
            stunden6 = new JLabel("");
            stunden6.setForeground(Color.white);
            stunden6.setFont(new Font("Serif",Font.BOLD,30));
        
            stunden7 = new JLabel("");
            stunden7.setForeground(Color.white);
            stunden7.setFont(new Font("Serif",Font.BOLD,30));
        
            stunden8 = new JLabel("");
            stunden8.setForeground(Color.white);
            stunden8.setFont(new Font("Serif",Font.BOLD,30));
        
            //Add everything to JFrame
            this.add(field);
            this.add(knopf);
            this.add(displayIsSchool);
            this.add(stunden);
            this.add(stunden1);
            this.add(stunden2);
            this.add(stunden3);
            this.add(stunden4);
            this.add(stunden5);
            this.add(stunden6);
            this.add(stunden7);
            this.add(stunden8);
        }
        
    //Call Method for set Day
    public void sayIf() {

        //Switch statement for user Input 
        switch(textInhalt) 
        {
                
            case "Montag":
                Montag.sagName();
                break;
            case "Dienstag":
                Dienstag.sagName();
                break;
            case "Mittwoch":
                Mittwoch.sagName();
                break;
            case "Donnerstag":
                Donnerstag.sagName();
                break;  
            case "Freitag":
                Freitag.sagName();      
                break;
            case "Samstag":
                Samstag.sagName();
                break;
            case "Sonntag":
                Sonntag.sagName();
                break;  
        }
    }   
    
        //schedule
        static String[] monHours = {"Bio", "Bio", "Mathe", "Mathe", "Chemie", "Chemie", "Frei", "Musik", "Musik"};
        static String[] dinHours = {"Deutsch", "Mathe", "Physik", "Physik", "Englisch", "Frei", "Französisch", "Frei", "Frei"};
        static String[] mitHours = {"Französisch", "Französisch", "Englisch", "Tutor", "Geschichte", "Geschichte", "Frei", "Sport", "Sport"};
        static String[] donHours = {"Englisch", "Englisch", "Deutsch", "Deutsch", "Informatik", "Informatik", "Frei", "Frei", "Frei"};
        static String[] freHours = {"PoWi", "PoWi", "Ethik", "Ethik", "Deutsch", "Frei", "Mathe", "Frei", "Frei"};
        static String[] samHours = {"", "", "", "", "", "", "", "", ""};
        static String[] sonHours = {"", "", "", "", "", "", "", "", ""};
        
        //create Day objects 
        static Tage Montag = new Tage(true, monHours, "Montag");
        static Tage Dienstag = new Tage(true, dinHours, "Dinestag")  ;
        static Tage Mittwoch = new Tage(true, mitHours, "Mittwoch")  ;
        static Tage Donnerstag = new Tage(true, donHours, "Donnerstag")  ;
        static Tage Freitag = new Tage(true, freHours, "Freitag")  ;
        static Tage Samstag = new Tage(false, samHours, "Samstag")  ;
        static Tage Sonntag = new Tage(false, sonHours, "Sonntag")  ;       
        
        
        //keyListener 
        public void actionPerformed(ActionEvent e) {
            if(e.getSource()==knopf) {
    
                textInhalt = field.getText();
                sayIf();
            }
        }
}

Tag (Day) Class:

package basicsPack;

public class Tage{
    
    //Variables for constructor 
    boolean isSchool;
    String[] stunden;
    String name;
    
    //Tage constructor 
    public Tage(boolean isSchool, String[] stunden, String name) {
        
        this.isSchool = isSchool;  
        this.stunden = stunden;
        this.name = name;
        
    }
    
    //sagName method
    public void sagName() {
        
        //Display hours an rather I have school
        if(this.isSchool == true) {
        
            GamePanel.displayIsSchool.setText("Du hast am "+ name + " Schule ");
            GamePanel.stunden.setText(this.stunden[0]);
            GamePanel.stunden1.setText(this.stunden[1]);
            GamePanel.stunden2.setText(this.stunden[2]);
            GamePanel.stunden3.setText(this.stunden[3]);
            GamePanel.stunden4.setText(this.stunden[4]);
            GamePanel.stunden5.setText(this.stunden[5]);
            GamePanel.stunden6.setText(this.stunden[6]);
            GamePanel.stunden7.setText(this.stunden[7]);
            GamePanel.stunden8.setText(this.stunden[8]);
            
        }else {
            
            GamePanel.displayIsSchool.setText("Du hast am " + name + " keine Schule");
            GamePanel.stunden.setText("");
            GamePanel.stunden1.setText("");
            GamePanel.stunden2.setText("");
            GamePanel.stunden3.setText("");
            GamePanel.stunden4.setText("");
            GamePanel.stunden5.setText("");
            GamePanel.stunden6.setText("");
            GamePanel.stunden7.setText("");
            GamePanel.stunden8.setText("");
        }
    }
}

This is what it looks like at the moment

This Is what I want it to look like


Solution

  • So yes, put the JTextField and JButton in their own JPanel in a BoxLayout using JPanel, that is fine, and place that JPanel in the BorderLayout.PAGE_START position of a JPanel that uses BorderLayout with the rest of the GUI below it. For example:

    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.event.KeyEvent;
    
    import javax.swing.*;
    
    public class Main2b {
        public static void main(String[] args) {
            SwingUtilities.invokeLater(() -> {
                GamePanel2 mainPanel = new GamePanel2();
    
                JFrame frame = new JFrame("GUI");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(mainPanel);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            });
        }
    
    }
    
    @SuppressWarnings("serial")
    class GamePanel2 extends JPanel {
        private JTextField field = new JTextField(10);
        private JButton knopf = new JButton("klick");
        
        public GamePanel2() {
            knopf.setMnemonic(KeyEvent.VK_K);
            
            JPanel topPanel = new JPanel();
            topPanel.setLayout(new BoxLayout(topPanel, BoxLayout.LINE_AXIS));
            topPanel.add(field);
            topPanel.add(knopf);
            
            setLayout(new BorderLayout());
            add(topPanel, BorderLayout.PAGE_START);
            add(Box.createRigidArea(new Dimension(650, 400)));
            
        }
    }
    

    displays as

    enter image description here


    Other unrelated issues:

    For example:

    @SuppressWarnings("serial")
    class GamePanel2 extends JPanel {
        public static final String[] TAG_DER_WOCH = { "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag",
                "Sonntag" };
        private JComboBox<String> tagDerWochCombo = new JComboBox<>(TAG_DER_WOCH);
        // private JTextField field = new JTextField(10);
        // private JButton knopf = new JButton("klick");
    
        public GamePanel2() {
            tagDerWochCombo.setSelectedIndex(-1);
            // knopf.setMnemonic(KeyEvent.VK_K);
            
            tagDerWochCombo.addActionListener(e -> {
                System.out.println(tagDerWochCombo.getSelectedItem());
            });
    
            JPanel topPanel = new JPanel();
            topPanel.setLayout(new BoxLayout(topPanel, BoxLayout.LINE_AXIS));
            topPanel.add(tagDerWochCombo);
            // topPanel.add(knopf);
    
            setLayout(new BorderLayout());
            add(topPanel, BorderLayout.PAGE_START);
            add(Box.createRigidArea(new Dimension(650, 400)));
    
        }
    }