I wanted to create a simple table with the some of the features of a JTable, but easier to style, so I created a couple of boxes in a box layout, one for the header and another to contain the cells. When I added the JScrollPane to the cell's box, it indented the header box and now the don't line up.
Misaligned box:
I've tried setAlignmentX and ComponentOrientation, but not luck. Does anyone have any ideas?
public class GUIInventory extends JPanel
{
Box headersBox = Box.createHorizontalBox();
Box cellsBox = Box.createVerticalBox();
JScrollPane scrollPane;
ArrayList<Box> rows = new ArrayList<>();
ArrayList<JLabel> cells = new ArrayList<>();
JLabel[] headerLabels = new JLabel[4];
String[] headerLabelNames = {"Name", "Order Date", "Order Number", "Cost"};
public GUIInventory()
{
this.setBackground(Color.WHITE);
this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
this.setAlignmentX(Component.LEFT_ALIGNMENT);
Border outer = BorderFactory.createMatteBorder(0, 0, 0, 1, Color.LIGHT_GRAY);
Border inner = BorderFactory.createEmptyBorder(10, 10, 10, 10);
for(int i = 0; i < this.headerLabels.length; i++)
{
this.headerLabels[i] = new JLabel(this.headerLabelNames[i]);
this.headerLabels[i].setBorder(BorderFactory.createCompoundBorder(outer, inner));
this.headerLabels[i].setFont(new Font("Arial", Font.BOLD, 16));
this.headerLabels[i].setMaximumSize(new Dimension(200, (int) this.headerLabels[i].getPreferredSize().getHeight()));
this.headerLabels[i].setAlignmentX(Component.LEFT_ALIGNMENT);
this.headersBox.add(this.headerLabels[i]);
}
this.headersBox.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createMatteBorder(1, 1, 0, 0, Color.LIGHT_GRAY), BorderFactory.createMatteBorder(0, 0, 2, 0, Color.BLACK)));
this.headersBox.setAlignmentX(Component.LEFT_ALIGNMENT);
this.headersBox.setBorder(BorderFactory.createLineBorder(Color.GREEN, 2));
this.cellsBox.setBorder(BorderFactory.createMatteBorder(1, 1, 0, 0, Color.LIGHT_GRAY));
this.cellsBox.setAlignmentX(Component.LEFT_ALIGNMENT);
this.scrollPane = new JScrollPane(this.cellsBox);
this.add(this.headersBox);
this.add(this.scrollPane);
}
I've tried setAlignmentX
That is only relevant for the components that you add to the panel using the vertical BoxLayout:
this.add(this.headersBox);
this.add(this.scrollPane);
You set the alignment on the headersBox
, but not the scrollPane
. So you are missing:
this.scrollPane.setAlignmentX(Component.LEFT_ALIGNMENT);
Also
this.setAlignmentX(Component.LEFT_ALIGNMENT);
is not needed, since this is the parent panel, not a child component.
and,
this.headerLabels[i].setAlignmentX(Component.LEFT_ALIGNMENT);
is not needed, since left alignment is not relevant for a horizontal layout.
and,
this.cellsBox.setAlignmentX(Component.LEFT_ALIGNMENT);
is not needed since this component is added to the scroll pane