Reputation: 2100
I am trying to build a set of two labels and a button (label-button-label) that looks something like the top row of this:
.
I am struggling to do this with Java Swing. I've tried BorderLayout, with BorderLayout.WEST, BorderLayout.CENTER, BorderLayout.EAST but that makes the button fill the space:
here's the code I used for that:
panel = new JPanel(new BorderLayout());
l1 = new JLabel("l1");
button = new JButton("B");
l2 = new JLabel("l2");
panel.add(l1, BorderLayout.WEST);
panel.add(button, BorderLayout.CENTER);
panel.add(l2, BorderLayout.EAST);
I've also tried GridBagLayout, and the closest I've come there is to have them spaced out, but not hugging the sides:
Code for that:
panel = new JPanel(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.VERTICAL;
l1 = new JLabel("L1");
l2 = new JLabel("L2");
button = new JButton("B");
c.weightx = Integer.MAX_VALUE;
c.gridx = 0;
panel.add(l1, c);
c.weightx = 1;
c.gridx = 1;
panel.add(button, c);
c.weightx = Integer.MAX_VALUE;
c.gridx = 2;
panel.add(l2, c);
Any ideas?
Upvotes: 2
Views: 4050
Reputation: 129
You can add a "cheater," like this:
JButton buttonNeeded = new JButton();
window.add(buttonNeeded);
JButton cheaterButton = new JButton();
cheaterButton.setEnabled(false);
window.add(cheaterButton);
The cheaterButton
fills the screen, but then the user can't click it or see it. Not great for everything, but it works for adding JButton
s, at least.
Upvotes: 0
Reputation: 205775
Try GridLayout
with LEFT
, CENTER
& RIGHT
labels.
JPanel p = new JPanel(new GridLayout(1,0));
p.add(new JLabel("Test", JLabel.LEFT));
p.add(new JLabel("Test", JLabel.CENTER));
p.add(new JLabel("Test", JLabel.RIGHT));
SSCCE:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
/** @see http://stackoverflow.com/a/14501446/230513 */
public class Test {
private void display() {
JFrame f = new JFrame("Test");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel p = new JPanel(new GridLayout(1, 0));
p.add(new JLabel("Test", JLabel.LEFT));
JPanel buttonPanel = new JPanel();
buttonPanel.add(new JButton("Test"));
p.add(buttonPanel);
p.add(new JLabel("Test", JLabel.RIGHT));
f.add(p, BorderLayout.NORTH);
f.add(new JPanel() {
@Override
public Dimension getPreferredSize() {
return new Dimension(320, 120);
}
}, BorderLayout.CENTER);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Test().display();
}
});
}
}
Upvotes: 4
Reputation: 47608
Here are two ways to doit. Once with a BorderLayout and once with a GridBagLayout:
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class TestGridBagLayout {
protected void initUI1() {
final JFrame frame = new JFrame("Grid bag layout");
frame.setTitle(TestGridBagLayout.class.getSimpleName());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel l1 = new JLabel("L1");
JLabel l2 = new JLabel("L2");
JButton b = new JButton("B");
JPanel panel = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
panel.add(l1, gbc);
gbc.weightx = 1.0;
gbc.anchor = GridBagConstraints.CENTER;
panel.add(b, gbc);
gbc.weightx = 0;
panel.add(l2, gbc);
frame.add(panel);
frame.setSize(800, 100);
frame.setVisible(true);
}
protected void initUI2() {
final JFrame frame = new JFrame("Border layout");
frame.setTitle(TestGridBagLayout.class.getSimpleName());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel(new BorderLayout());
JLabel l1 = new JLabel("L1");
JLabel l2 = new JLabel("L2");
JButton b = new JButton("B");
JPanel wrappingPanel = new JPanel(new FlowLayout());
wrappingPanel.add(b);
panel.add(l1, BorderLayout.WEST);
panel.add(l2, BorderLayout.EAST);
panel.add(wrappingPanel);
frame.add(panel);
frame.setLocation(0, 125);
frame.setSize(800, 100);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
TestGridBagLayout test = new TestGridBagLayout();
test.initUI1();
test.initUI2();
}
});
}
}
Upvotes: 4