Use both fixed and flexible elements in GridBaglayout row (or column) - java

I'm trying to display two buttons next to a text field:
I gave up on the text already, but I really need the two buttons to remain small while the text field should expand with the window:
Currently, I use this layouts:
The text field and the two buttons are both in JPanel.
//JPanel group - the container
//List<JComponent> - the conponents added to JPanel
//int[] weights - weights of components
GridBagLayout lay = new GridBagLayout();
for(int i=0,l=fields.size(); i<l; i++) {
InputDef field = fields.get(i);
GridBagConstraints c = new GridBagConstraints();
if(weights.length<i) {
c.weightx = weights[i];
}
c.fill = GridBagConstraints.HORIZONTAL;
lay.setConstraints(field.getField(), c);
}
group.setLayout(lay);
In the documentation I see that for the components to fill their area horizontally, you should set the GridBagConstraints.HORIZONTAL to the constraints of the components.
Further, I read that you should set different GridBagConstraints#weightx to make the elements take different amount of space.
However running the code above doesn't do anything - the JPanel looks exactly the same with no layout manager whatsoever.

Related

JLabel not aligning to the right in a BoxLayout

I have some JLabel components in a JPanel (taskPanel) with a BoxLayout (which is in a panel with a GridBagLayout) and the labels are refusing to be aligned to the right. They keep aligning to the left no matter how I manipulate them.
Here I setup the GridBagConstraints for the panel that has the labels
GridBagConstraints taskPanelC = new GridBagConstraints();
taskPanelC.gridx = 4;
taskPanelC.gridy = 0;
taskPanelC.gridwidth = 1;
taskPanelC.anchor = GridBagConstraints.NORTHEAST;
taskPanelC.weighty = 1;
taskPanelC.weightx = 1;
taskPanelC.insets = new Insets(10, 10, 10, 10);
timePanel.add(taskPanel, taskPanelC);
Here are the GridBagConstraints for the panel before the task panel
//Setup the gridBagLayout
GridBagConstraints timeTextC = new GridBagConstraints();
timeTextC.gridx = 1;
timeTextC.gridy = 0;
timeTextC.gridwidth = 3;
timeTextC.anchor = GridBagConstraints.CENTER;
timeTextC.weighty = 1;
timeTextC.weightx = 1;
Here I add a header to the taskPanel (I don't really care how this is aligned)
taskListLabel = new JLabel("Task List");
taskListLabel.setFont(new Font("Helvetica", Font.BOLD, 24));
taskPanel.add(taskListLabel);
Here is where I am adding the labels I want to be right-justified/aligned. I have tried setHorizontalTextPosition and setAlignmentX and both do not work, causing the text to stay left aligned. However, when I tried setAlignmentX, the header became unaligned with the task labels
JLabel task = new JLabel(name, SwingConstants.RIGHT);
//Allow deleting of the label
task.addMouseListener(new ClickListener());
//Add task to the task panel
taskPanel.add(task);
This is what it currently looks like
I want the text under task list to be right-aligned so the time is always on the right
Here is a link to the full code in case the summary was not enough: Github Repo
Check out the following methods from the JLabel API:
setHorizontalAlignment(...) - used to align the text when the width of the label is greater than the width of the text
setAlignmentX(...) - might be used by the layout manager to align component
I copied the entire code from the link
https://github.com/kennyftang/WorkflowTimer/blob/master/src/WorkflowTimer.java
I guess the code is incomplete, as addTask(String name) method is not called anywhere in the code.
I am really confused about which label you want to be on the right side? As I observed that the "task list" are already on the right side.
Please provide the image explaining which label you want on which side? Also, don't use so many layouts and get confused for this small UI just one layout is enough.
Step 1 Comment the following line.
// taskPanel.add(taskListLabel);
Step2 Add the following 4 lines in that place,
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.add(taskListLabel, BorderLayout.EAST);
taskPanel.add(panel,BorderLayout.LINE_END);
Step3 Comment the following line.
//taskPanel.add(task);
Step4 Add the following 4 lines in that place,
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.add(task,BorderLayout.EAST);
taskPanel.add(panel,BorderLayout.LINE_END);
Let me know if you have any issues. Thanks.
I know this is bit heavy solution, here instead of Jpanel we may use some even light weight component as well.

Adding JDesktopPane to JFrame using GridBagLayout

How do I add the JDesktopPane to JFrame using GridBagLayout and set its height and width. If I add JDesktopPane that contains JInternalFrame I don't get anything. But works well in case of GridLayout but the problem is I can't set my desired size in it as GridLayout splits equal space among each component added.
You will probably need to set the fill and weight attributes of the GridBagConstraints...
GridBagConstraints gbc = new GridBagConstraints();
gbc.weightx = 1;
gbc.weighty = 1;
gbc.fill = GridBagConstraints.BOTH;
This will cause the component to want to push to the limits of the container and will cause the component to fill it's cell within the grid
This override the components preferred size (for the most part)
Take a look at How to Use GridBagLayout for more details...

Resize buttons using Grid Bag Layout

I want to resize my buttons to be the same size and place then in a Panel on a JApplet. I have tried using
public void init() {
// TODO start asynchronous download of heavy resources
JButton btnWestern=new JButton("Western");
JButton btnPop=new JButton("Pop");
GridBagConstraints c4=new GridBagConstraints();
JPanel jPanel1 = new JPanel();
getContentPane().setLayout(new java.awt.GridBagLayout());
jPanel1.setLayout(new java.awt.GridBagLayout());
c4.gridx = 0;
c4.gridy = 0;
c4.insets = new Insets(36, 10, 0, 249);
jPanel1.add(btnWestern, c4);
c4.gridx = 0;
c4.gridy = 1;
c4.insets = new Insets(33, 10, 0, 249);
jPanel1.add(btnPop, c4);
add(jPanel1, new java.awt.GridBagConstraints());
}
When I run, this is what I get
But I noticed that if I change the button text to be the same or have the same length, like
JButton btnWestern=new JButton("Button1");
JButton btnPop=new JButton("Button2");
I get the desired output
What can I do to make sure that even the text of the buttons are not the same length, the buttons are the same size?
I'd suggest reading through the How to Use GridBagLayout tutorial if you haven't already. GridBagLayout is powerful but it is also one of the more complex LayoutManagers available.
I believe you need to set the GridBagConstraints.fill property to get the behavior you desire.
In your case this should be something like
c4.fill = GridBagConstraints.HORIZONTAL;
Edit (A bit of explanation for the observed behavior) When you use the same text on both buttons, their calculated size ends up being the same, so they are rendered as you want. When you use different size text, the buttons will render in a size that fits the text by default. The default value for GridBagConstraints.fill is GridBagConstraints.NONE which indicates to the LayoutManger to not resize the component. Changing the fill to GridBagConstraints.HORIZONTAL tells the LayoutManger to resize the component horizontally to fill the display area.

Gridbaglayout Second row scrolls out of the container [duplicate]

I am trying to achieve a layout similar to that of a carousel. It needs to have images added horizontally with a checkbox field in the second row. I have a panel within a jscrollpane and individual images are added to the panel as labels. Please see screen shot.
screenshot
When I scroll the pane , the first row containing the images stays well within the panel..but if you notice the second row of checkboxes , it scrolls out of the panel. Here is the code ...
JLabel lab1=new JLabel();
for (int ii=0; ii<imageFiles.length; ii++) {
GridBagConstraints constraint = new GridBagConstraints();
lab1 = new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);
constraint.gridx = ii;
constraint.gridy =0;
jPanel9.add(lab1,constraint);
}
for (int ii=0; ii<imageFiles.length; ii++) {
GridBagConstraints constraint1 = new GridBagConstraints();
constraint1.anchor = GridBagConstraints.SOUTH;
chkbox = new Checkbox("asdasdada");
constraint1.gridx = ii;
constraint1.gridy =1;
jPanel9.add(chkbox, constraint1);
}
Not sure what is wrong..Any help is much appreciated..Thanks..
The problem is that you are mixing AWT components (heavyweight) with Swing components (lightweight). I have 2 recommendations:
Don't mix heavyweight and lightweight components
Try to use lightweight components as much as possible
So in your code, replace Checkbox by JCheckbox and it should work just fine.

GridBagLayout with fixed number of columns

I just want a GridLayout which has the change to merge cells. So I found the GridBagLayout. It seems that this layout is very flexible. I don't need this flexibility. Is there a way to tell the GridBagLayout that it should use, for example, 20 columns and 10 rows over the whole width and height?? It should look like a GridLayout, but with merging cells.
Thx
As far as I know, you can use the same height and width for more than one JComponent. But you'll have to change them, where you want a merged cell.
Here is an example from how to use GridBagLayout
protected void makebutton(String name,
GridBagLayout gridbag,
GridBagConstraints c) {
Button button = new Button(name);
gridbag.setConstraints(button, c);
add(button);
}
public void init() {
GridBagLayout gridbag = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
setFont(new Font("SansSerif", Font.PLAIN, 14));
setLayout(gridbag);
c.fill = GridBagConstraints.BOTH;
c.weightx = 1.0;
makebutton("Button1", gridbag, c);
makebutton("Button2", gridbag, c);
makebutton("Button3", gridbag, c);
c.gridwidth = GridBagConstraints.REMAINDER; //end row
makebutton("Button4", gridbag, c);
c.weightx = 0.0; //reset to the default
makebutton("Button5", gridbag, c); //another row
.........
}
So you don't need to specify the height and width all the time.
I wish that this was possible, as it would make my project much easier. However, this is the answer:
GridBagLayout offers no methods to explicitly define the number of rows or columns in the grid, nor does it have methods to define the size of each cell in the grid. Instead, GridBagLayout calculates the number of rows and columns in a grid by the number of Components placed on the screen. If a container has five Components lined up horizontally, then the grid consists of five columns and one row. If the Container has five Components lined up vertically, then the grid consists of one column and five rows.
I got it from: http://www2.sys-con.com/itsg/virtualcd/java/archives/0304/tabbone/index.html
For my project, I'm thinking of creating the top row and left column of my GridBagLayout with x and y number of 1 pixel by 1 pixel transparent panels to manually create an excel-like grid and put objects within that grid structure, using gridwidth and gridheight to merge the cells as desired. This should allow me an easy way to create my complicated layout and have everything resize correctly (knock on wood).

Categories

Resources