I've been working on a view for an Oxygen plugin and I'm having trouble getting my GridBagLayout to start at the top. Currently when you add content to the JPanel it vertically centers in the div like the following image.
// swing imports
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JCheckBox;
import javax.swing.JButton;
import javax.swing.JScrollPane;
// awt imports
import java.awt.Color;
import java.awt.Insets;
import java.awt.BorderLayout;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class DBPediaPanel extends JPanel {
private JScrollPane scrollPane;
private JPanel scrollContent;
private JButton btnAcceptAll;
private int currentRow = 0;
public DBPediaPanel() {
this.setLayout(new BorderLayout());
this.setBackground(Color.BLACK);
this.add(getScrollPane(), BorderLayout.CENTER);
btnAcceptAll = new JButton("Add Row");
btnAcceptAll.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
addStringToList("row " + currentRow);
System.out.println("test");
}
});
this.add(btnAcceptAll, BorderLayout.SOUTH);
}
private JScrollPane getScrollPane() {
scrollContent = new JPanel(new GridBagLayout());;
scrollPane = new JScrollPane(scrollContent);
return scrollPane;
}
private GridBagConstraints createGbc(int x, int y) {
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = x;
gbc.gridy = y;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.anchor = (x == 0) ? GridBagConstraints.FIRST_LINE_START : GridBagConstraints.FIRST_LINE_START;
gbc.fill = (x == 0) ? GridBagConstraints.BOTH : GridBagConstraints.HORIZONTAL;
gbc.insets = (y == 0) ? new Insets(3, 5, 3, 5) : new Insets(0, 5, 3, 5);
gbc.weightx = (x == 0) ? 0.1 : 1.0;
gbc.weighty = 0.0;
return gbc;
}
public void addStringToList(String str) {
System.out.println("in addStringToList");
System.out.println("attempting to add " + str + " to the list");
GridBagConstraints gbc = createGbc(0, currentRow);
scrollContent.add(new JCheckBox(), gbc);
gbc = createGbc(1, currentRow);
scrollContent.add(new JTextField(str), gbc);
// revalidate and repaint the scrollContent to ensure it gets added to the view
scrollContent.layout();
scrollContent.revalidate();
scrollContent.repaint();
currentRow++;
}
}
Thanks for the help. I almost have it there but it doesn't seem to be respecting gbc.anchor = GridBagConstraints.FIRST_LINE_START
.
GridBagLayout
lays isn't components out around the centre of the container by default
The most common solution is to place a filler component (such as a JLabel
) in the last position and set its weightx/y
to 1. In your case, I'd place it in the last row