Which Swing layout(s) do you recommend? [closed]

2019-01-21 01:26发布

问题:

There are 8 layout managers in the Java library alone, and then there's a bunch of 3rd party products as well.

The other day, I tried to use SpringLayout and... well, it ain't working out for me. See my other question. So... if you have a Swing app to design, and you want your layout just so, what are your preferred layout managers? Any interesting/useful experiences to relate?

Update: Yup, sure I'm aware that different LMs are appropriate for different layouts. But I'd expect that most of you use 1, 2 or maybe 3 for most everything you do, or you swear by a single one that's so versatile you never need anything else. With enough responses, I'd expect to see something like a bell curve, with a peak on GridBagLayout or MigLayout (for example) and a long tail of a few stragglers using (say) BoxLayout or FlowLayout.

Hopefully, the distribution of responses will reveal some trends as to what people use most to Get Stuff Done


UPDATE and Summary

OK, after almost 2 days, MiGLayout is definitely out in front! Its fans will be happy to hear that it looks like this layout will be entering the "official" library soon.

GroupLayout, FormsLayout and TableLayout are relatively new and haven't gotten much exposure. Perhaps others will be as surprised to find out about them as I was.

回答1:

MiGLayout, no doubt. Honestly, it's the only Swing layout manager I know of that makes any sense.

The mere fact that there are 8 layout managers in the core JDK is a good sign that the Swing creators had absolutely no idea about what they were trying to do. This is not to trash the rest of the Swing - it's a good GUI toolkit, except for the layout managers.



回答2:

All of them, in combination. That's the whole point. Each layout manager fulfills different requirements, and by nesting panels with different layout managers, you can achieve almost anything.

The "do everything in a single panel" layout managers like GridBagLayout and GroupLayout (and lots of 3rd party ones) have their place, mainly when you need components in different parts of the layout to align, but with a large layout, they generally result in a huge, hard-to-handle mess.



回答3:

It depends on what kind of GUI you are creating. You might use just one or two of the simple layouts, or you might need to reach for a more advanced layout. My overall layout manager use would probably break down to something like this, although it would vary based on the project:

  • 65% GridBagLayout - The one layout that will get it done, no matter what you need to do.
  • 15% Box/BoxLayout - Great for quickly & easily sticking a couple components together.
  • 12% BorderLayout - Good for attaching a button panel or info panel to a content panel. I almost always use it to add content to a JFrame.
  • 3% FlowLayout - Useful for button panels, but not much else.
  • 3% CardLayout - Mostly useful in programs that display different content panels for different operational modes.
  • 2% Other layouts - It's very rare that I need anything else, but occasionally one of the other layouts comes in handy.

Once you get the hang of GridBagLayout, it's not that bad to write initially, but it's still not pretty to work with, or to debug later on. I tried MiGLayout for something recently and was disappointed to find that the MiGLayout actually ended up being more complicated to use than the GridBagLayout in that particular case.

Some people try to avoid GridBagLayout like the plague; but the truth is, there are some things that no combination of simple layouts will be able to handle. It's fine to split a GUI into panels for different logical sections, but I think if you're creating a whole bunch of unnecessary extra nested panels just for the purpose of positioning components, you clearly need to learn how to use a GridBagLayout (or other similarly advanced layout, like MiGLayout). You might get your GUI to look okay with a nasty mess of nested BorderLayouts and GridLayouts and BoxLayouts, but as soon as someone starts resizing your application windows and dialogs to be either smaller or larger than you originally designed them, your GUI will probably look horrible and your customers will start to form a negative opinion about your product since you couldn't get such a simple thing right.

Update: I've been using WindowBuilder in Eclipse for a while now, and it greatly simplifies working with many layouts, especially GridBagLayout. I used to spend a lot of time writing layouts by hand, but with WindowBuilder or probably any similarly advanced visual editor, you can create the layouts in much less time.



回答4:

DesignGridLayout both looks great and is easy to use through fluent interface.

just look at example:

with just a few lines of clean code:

    layout.row().grid(label("Last Name"))   .add(lastNameField) .grid(label("First Name"))  .add(firstNameField);
    layout.row().grid(label("Phone"))       .add(phoneField)    .grid(label("Email"))       .add(emailField);
    layout.row().grid(label("Address 1"))   .add(address1Field);
    layout.row().grid(label("Address 2"))   .add(address2Field);
    layout.row().grid(label("City"), 1)     .add(cityField);
    layout.row().grid(label("State"))       .add(stateField)    .grid(label("Postal Code")) .add(postalField);
    layout.row().grid(label("Country"), 1)  .add(countryField);
    layout.emptyRow();
    layout.row().center().add(newButton).add(deleteButton).add(editButton).add(saveButton).add(cancelButton);


回答5:

It depends which kind of layout you need, that's why you have 8 of them:

  1. BorderLayout, simple and quite useful to design normal content frames (with main content in the middle and helpers on sides).
  2. GridLayout, useful when you have a grid of objects that should be of the same size (buttons? textfields?).
  3. GridBagLayout, very flexible, needs some tweaking to be fine and it is quite verbose (but I raccomend it if you want to do things well).
  4. FlowLayout, useless.. not a very layout: just placing item one next to another.
  5. CardLayout, useful for tabs or subviews that must be switched.
  6. BoxLayout, never used it too much.. it should be a sort of enhanced FlowLayout but it's not enough flexible to be used intensively.


回答6:

GroupLayout is pretty decent. It was originally intended for use by GUI Builder applications but I've found it to be very straight forward to code by hand too.



回答7:

FormLayout, part of the JGoodies Forms package has been a workhorse for me. It's not perfectly flexible in that it works hard to make your design look good. I've used it for several years on dozens of projects and it keeps on producing good looking output quickly.

You specify your layout in human-readable text, then add the components. Done.



回答8:

GridBagLayout. Does pretty much all that you need (kind of) and it's in the Java library. Admittedly it does need some help, and the API is terrible.

GroupLayout makes a real mess of your layout code. Okay, so most people's GUI code is a big ball of mud. But your's does not have to be! Perhaps a nice interface could be put onto this layout manager, but I suspect it might have to be cloned-and-owned.

I am not in favour of introducing external dependencies unless they are really necessary. Also a lot of the third-party layout managers use strings of data, which have all the usual issues.



回答9:

I usually use border layout with gridlayout, first i design ui on paper prototype like ;

alt text http://www.usernomics.com/images/paper-mockup.jpg

After that we can split screen to gridlayout on borderlayout. In this picture we see NORTH, CENTER, SOUTH part (BorderLayout elements) and every part's layout can be gridlayout or BorderLayout, it depends on you. Same Layouts can use one within the other.



回答10:

There is no real answer to your question except that: it depends. It depends on what kind of frame (form) you are trying to create. I am no Swing-guru, but created a couple of (moderately advanced) GUI's and have never had the need to touch the GridBagLayout manager. I have always been able to create my GUI's using a combination of "easier" layout managers. For example, you can give your frame the BorderLayout and then place another layout in the SOUTH of that BorderLayout.



回答11:

Use IntelliJ IDEA with its GUI designer. Makes GridBagLayout easy.

http://madbean.com/anim/totallygridbag/



回答12:

I only use GridBagLayout, especially when doing some complex interfacing, believe me GridBagLayout can do anything. I also recommended the FlowLayout, because it is easy to use, and understandable, good for putting a group of buttons. Actually I only use this two layouts since it is part of the JDK library as for the MigLayout I haven't tried it yet so for now can't recommend it for you.



回答13:

There are following layout options available:

MiGLayout
TableLayout
GroupLayout
FormsLayout

Out of these above MigLayout is the most recommended one as it is swing layout manager. There others have not got much exposure.



回答14:

I'm a Swing neophyte, but in the course of writing my first Swing application, I've tried four different layout managers: FlowLayout, BoxLayout, GridLayout and GroupLayout. In my opinion, FlowLayout and BoxLayout seems most appropriate for laying out groups of components of similar sizes. For components of varying sizes, GroupLayout seems to be the way to go. Steeper learning curve than the other two, but definitely worth it. As for GridLayout, I'd argue that you can achieve the same results you would with that layout manager by using a combination of FlowLayout and BoxLayout -- and you'd probably have more control of the placement of your components. But maybe that's just me :)

Sheldon