Domanda

Sorry for another "what's wrong with my code here" question, but I've been fighting with this GridBagOfHurtLayout and I don't understand what could possibly be happening.

I want to make a UI with a layout like this:

What it should be

The paint program crashed and all I got was a zoomed out screenshot, sorry for the graininess. So the way I see it, I want a GridBagLayout with 4 columns, with the top two panes spanning 2 columns each, the text field and the large pane spanning 3, and the search button and bottom left pane spanning 1 (horizontally). Here's my code for doing so:

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setPreferredSize(new Dimension(1080, 720));

this.setLayout(new GridBagLayout());
GridBagConstraints constraints;

projectLabel = new JLabel("Projects");
constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.NONE;
constraints.anchor = GridBagConstraints.LINE_START;
constraints.gridx = 0;
constraints.gridy = 0;
constraints.gridwidth = 2;
constraints.weightx = 0.25;
constraints.weighty = 0;
constraints.insets = new Insets(4,4,4,4);
this.add(projectLabel);

projectScrollPane = new JScrollPane();
constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.BOTH;
constraints.gridx = 0;
constraints.gridy = 1;
constraints.gridwidth = 2; 
constraints.weightx = 1.0;
constraints.weighty = 0.5;
constraints.insets = new Insets(4,4,4,4);
projectScrollPane.setPreferredSize(new Dimension(540, 240));
this.add(projectScrollPane,constraints);

fieldLabel = new JLabel("Fields");
constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.NONE;
constraints.anchor = GridBagConstraints.LINE_START;
constraints.gridx = 2;
constraints.gridy = 0;
constraints.gridwidth = 2;
constraints.weightx = 1.0;
constraints.weighty = 0;
constraints.insets = new Insets(4,4,4,4);
this.add(fieldLabel);

fieldScrollPane = new JScrollPane();
constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.BOTH;
constraints.gridx = 2;
constraints.gridy = 1;
constraints.gridwidth = 2;
constraints.weightx = 1.0;
constraints.weighty = 0.5;
constraints.insets = new Insets(4,4,4,4);
fieldScrollPane.setPreferredSize(new Dimension(540, 240));
this.add(fieldScrollPane,constraints);

searchTextField = new JTextField();
constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.gridx = 0;
constraints.gridy = 2;
constraints.gridwidth = 3;
constraints.weightx = 2.0;
constraints.weighty = 0.0;
constraints.insets = new Insets(4,4,4,4);
searchTextField.setPreferredSize(new Dimension(1000,30));
this.add(searchTextField,constraints);

searchButton = new JButton("Search");
constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.NONE;
constraints.gridx = 3;
constraints.gridy = 2;
constraints.weightx = 0.0;
constraints.weighty = 0.0;
constraints.insets = new Insets(4,4,4,4);
searchButton.setSize(new Dimension(80,30));
this.add(searchButton,constraints);

imageScrollPane = new JScrollPane();
constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.BOTH;
constraints.gridx = 0;
constraints.gridy = 3;
constraints.weightx = 0.25;
constraints.weighty = 1.0;
constraints.insets = new Insets(4,4,4,4);
imageScrollPane.setPreferredSize(new Dimension(360,810));
this.add(imageScrollPane,constraints);

imagePane = new JEditorPane();
constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.BOTH;
constraints.gridx = 1;
constraints.gridy = 3;
constraints.gridwidth = 3;
constraints.weightx = 1.0;
constraints.weighty = 1.0;
constraints.insets = new Insets(4,4,4,4);
imagePane.setPreferredSize(new Dimension(720,810));
this.add(imagePane,constraints);

this.pack();

The labels weren't in the original layout. Each of the ScrollPanes will eventually contain a JList, but for now I'm just trying to get the empty layout to look right, which it does not. What I currently get is this.

What I actually get

The text field can't be convinced to take up 3 columns, or maybe the first scroll pane takes up 3. I've tried changing it every way I can think of, but nothing's helping. I'm probably going to abandon this and do nested panels with BoxLayout, but I'd like to know why this doesn't work, because I thought that I was doing everything right. Any insights? Thanks in advance.

È stato utile?

Soluzione

Swing gets confused here because it does not realy have a reference to where the columns should be.

Best solution in this case would be to create at least one row with all columns, and the weightx defined on these columns.

Also, a JEditorPane doesn't work well in a gridBagLayout. You should use a JScrollPane (or something else) and put the JEditorPane in this pane.

    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setPreferredSize(new Dimension(1080, 720));

    this.setLayout(new GridBagLayout());
    GridBagConstraints constraints;

    JLabel a = new JLabel();
    constraints = new GridBagConstraints();
    constraints.fill = GridBagConstraints.BOTH;
    constraints.gridx = 0;
    constraints.gridy = 0;
    constraints.weightx=0.25;
    constraints.insets = new Insets(4,4,4,4);
    this.add(a,constraints);

    JLabel b = new JLabel();
    constraints = new GridBagConstraints();
    constraints.fill = GridBagConstraints.BOTH;
    constraints.gridx = 1;
    constraints.gridy = 0;
    constraints.weightx=0.25;
    this.add(b,constraints);

    JLabel c = new JLabel();
    constraints = new GridBagConstraints();
    constraints.fill = GridBagConstraints.BOTH;
    constraints.gridx = 2;
    constraints.gridy = 0;
    constraints.weightx=0.5;
    constraints.insets = new Insets(4,4,4,4);
    this.add(c,constraints);

    JLabel d = new JLabel();
    constraints = new GridBagConstraints();
    constraints.fill = GridBagConstraints.BOTH;
    constraints.gridx = 3;
    constraints.gridy = 0;
    constraints.weightx=0;
    this.add(d,constraints);

    JLabel p1 = new JLabel("Project - 1");
    constraints = new GridBagConstraints();
    constraints.fill = GridBagConstraints.BOTH;
    constraints.gridx = 0;
    constraints.gridy = 0;
    constraints.gridwidth=2;
    constraints.insets = new Insets(4,4,4,4);
    this.add(p1,constraints);

    JLabel p2 = new JLabel("Project - 2");
    constraints = new GridBagConstraints();
    constraints.fill = GridBagConstraints.BOTH;
    constraints.gridx = 2;
    constraints.gridy = 0;
    constraints.gridwidth=2;
    constraints.insets = new Insets(4,4,4,4);
    this.add(p2,constraints);


    JScrollPane projectScrollPane = new JScrollPane();
    constraints = new GridBagConstraints();
    constraints.fill = GridBagConstraints.BOTH;
    constraints.gridx = 0;
    constraints.gridy = 1;
    constraints.gridwidth = 2;
    constraints.weighty=1;
    constraints.insets = new Insets(4,4,4,4);
    this.add(projectScrollPane,constraints);

    JScrollPane fieldScrollPane = new JScrollPane();
    constraints = new GridBagConstraints();
    constraints.fill = GridBagConstraints.BOTH;
    constraints.gridx = 2;
    constraints.gridy = 1;
    constraints.gridwidth = 2;
    constraints.insets = new Insets(4,4,4,4);
    fieldScrollPane.setPreferredSize(new Dimension(540, 240));
    this.add(fieldScrollPane,constraints);

    JTextField searchTextField = new JTextField();
    constraints = new GridBagConstraints();
    constraints.fill = GridBagConstraints.HORIZONTAL;
    constraints.gridx = 0;
    constraints.gridy = 2;
    constraints.gridwidth = 3;
    constraints.insets = new Insets(4,4,4,4);
    searchTextField.setPreferredSize(new Dimension(1000,30));
    this.add(searchTextField,constraints);

   JButton searchButton = new JButton("Search");
    constraints = new GridBagConstraints();
    constraints.fill = GridBagConstraints.NONE;
    constraints.anchor = GridBagConstraints.LINE_END;
    constraints.gridx = 3;
    constraints.gridy = 2;
    constraints.insets = new Insets(4,4,4,4);
    searchButton.setSize(new Dimension(80,30));
    this.add(searchButton,constraints);

    JScrollPane imageScrollPane = new JScrollPane();
    constraints = new GridBagConstraints();
    constraints.fill = GridBagConstraints.BOTH;
    constraints.gridx = 0;
    constraints.gridy = 3;
    constraints.insets = new Insets(4,4,4,4);
    constraints.weighty=1;
    this.add(imageScrollPane,constraints);

    JScrollPane imagePane = new JScrollPane();
    constraints = new GridBagConstraints();
    constraints.fill = GridBagConstraints.BOTH;
    constraints.gridx = 1;
    constraints.gridy = 3;
    constraints.gridwidth = 3;
    constraints.weighty=1;
    constraints.insets = new Insets(4,4,4,4);
    this.add(imagePane,constraints);

    this.pack();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top