===== CS 235 - Week 7 Lecture - 2021-10-04 ===== ===== TODAY WE WILL ===== * announcements * intro to layout managers * prep for next class * Currect reading: Course text - Chapter 11 - Section 11.2 - intro to layout management * Should be starting Homework 5 -- due by 11:59 pm on Friday, October 8th * other important reminders: * Friday, October 8 - NO LAB - intructor will be at a conference! * (but Homework 5 is due, 11:59 pm) * Monday, October 11 - REVIEW for Exam 1 * turn in any outstanding homework bits by 11:59 pm on TUESDAY, October 12th, so example homework solutions can be made available early on Wednesday, October 13th * Friday, October 15 - EXAM 1 - given on Canvas during Lab Time, you can take it in BSS 317 or somewhere with Internet (Homework 6 will come out AFTER Exam 1) * a layout manager is an object adding a LAYER of ABSTRACTION to allow us to more easily lay out various components within various containers * package java.awt provides several classic predefined layout manager classes, including: * FlowLayout * BorderLayout * GridLayout and package javax.swing provides a few more, including: * BoxLayout * you CAN use NO layout management, if you wish (and do it all yourself) ...and you can also subclass a layout manager class and write your own layout manager class, if you wish! * AND different panels in a single container can use different layout managers (convenient!) * important tradeoff to keep in mind, with layout managers: generally you tradeoff between EASE and CONTROL * just a few words more about FlowLayout: * default layout manager for MANY (not all) containers (including JPanel!) (but NOT for JFrame -- its default is BorderLayout) * positions components in the order they are added to the container, top-to-bottom, left-to-right and once the components that will fit on a "row" are determined, they are centered IF the default ALIGNMENT is being used * OK, then -- how can you set the layout manager for a container object? ...call its setLayout method, one of whose versions expects a layout manager object * and you can call methods of that layout management object to affect how it lays things out * for example, FlowLayout objects have a setAlignment method, called with lovely named constants such as FlowLayout.LEFT, FlowLayout.RIGHT, FlowLayout.CENTER ...to specify alignment within a "row" ===== BorderLayout ===== * contains 5 fixed positions, BorderLayout.NORTH BorderLayout.SOUTH BorderLayout.EAST BorderLayout.WEST BorderLayout.CENTER * when you use a 2-argument add method with a container using this, the second argument is expected to be one of the above constants, and the component is placed in a region specified, typically "filling" it (if you use the 1-argument add method for that container, that is using BorderLayout, it is assumed you mean to add it to the center) * [NOTE -- it is MORE COMMON, with BorderLayout, to add a JPanel to a region, rather than a non-container component...] * BEWARE -- if you add two or more components to the same BorderLayout region, you'll only see the LATEST one added...! ====== GridLayout ====== * not to be confused with GridBagLayout...! * GridLayout displays components within a grid...! within cells of "standard-sized" columns and rows * in one of its constructors, you give the desired number of rows and a desired number of columns, and as you call the container's 1-argument add constructor, this layout manager adds them to that grid left-to-right, top-to-bottom (so-called row-major order) * but, fun fact?! from: Java 16 API, specifically: https://docs.oracle.com/en/java/javase/16/docs/api/java.desktop/java/awt/GridLayout.html "When both the number of rows and the number of columns have been set to non-zero values, either by a constructor or by the setRows and setColumns methods, the number of columns specified is ignored." [!!] "Instead, the number of columns is determined from the specified number of rows and the total number of components in the layout." [!!] "So, for example, if three rows and two columns have been specified and nine components are added to the layout, they will be displayed as three rows of three columns." "Specifying the number of columns affects the layout only when the number of rows is set to zero." [!!]