问题
I have used a grid bag constraint, when I use the insets to add the spacing that works fine however when I use the gridx and gridy to set the position nothing happens. I just posted the entire code below, I don't know if this would help, thanks
import javax.swing.*;import java.awt.BorderLayout;import java.awt.CardLayout;importjava.awt.Color;import java.awt.GridBagConstraints;import java.awt.GridBagLayout;import java.awt.Insets;import java.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjavax.swing.ImageIcon import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JScrollPane;importjavax.swing.JTree;import javax.swing.tree.DefaultMutableTreeNode;import javax.swing.tree.DefaultTreeModel;public class MyWizard {
private JFrame frame = new JFrame("My Wizard");
private JPanel panelContainer = new JPanel();
private JPanel panelFirst = new JPanel();
private JPanel panelSecond = new JPanel();
private JPanel panelThird = new JPanel();
private JPanel panelButton = new JPanel(new GridBagLayout());
private JButton btNext = new JButton ("Next");
private JButton btNextTwo = new JButton ("Next");
private JButton btNextThree = new JButton("Next");
private JRadioButton btLdap, btKerbegos, btSpnego, btSaml2;
private JCheckBox btSan, btNFS, btYUMserver;
private CardLayout c1 = new CardLayout();
private JScrollPane scrollPane;
private JLabel lblPicture, lblPictureTwo;
DefaultMutableTreeNode root = new DefaultMutableTreeNode("FMW Components");
public MyWizard() {
//tree code
final DefaultMutableTreeNode accessibility =
add(root, "DB Tier", true);
add(accessibility, "RAC", false);
add(accessibility, "Gateways", false);
add(accessibility, "Datavault", false);
add(accessibility, "Agent", false);
add(accessibility, "Custom Databases", false);
root.add(accessibility);
final DefaultMutableTreeNode browsing =
new DefaultMutableTreeNode("APP Tier");
add(browsing, "IDM (OID, OVD)", false);
add(browsing, "IAM (Access Manager)", false);
add(browsing, "BIEE", false);
add(browsing, "Forms and Reports", false);
add(browsing, "Discoverer", false);
add(browsing, "Apps", false);
add(browsing, "Apex(4.2.1)", false);
root.add(browsing);
final DefaultTreeModel treeModel = new DefaultTreeModel(root);
final JTree tree = new JTree(treeModel);
final CheckBoxNodeRenderer renderer = new CheckBoxNodeRenderer();
tree.setCellRenderer(renderer);
final CheckBoxNodeEditor editor = new CheckBoxNodeEditor(tree);
tree.setCellEditor(editor);
tree.setEditable(true);
scrollPane = new JScrollPane(tree);
//tree code ends
panelFirst.setLayout(null);
panelSecond.setLayout(null);
panelThird.setLayout(new BorderLayout());
panelContainer.setLayout(c1);
panelFirst.add(btNext);
panelSecond.add(btNextTwo);
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(5,5,5,5);
//this is not working
gbc.gridx = 1;
gbc.gridy = 0;
panelButton.add(btNextThree, gbc);
panelThird.add(scrollPane, BorderLayout.CENTER);
panelThird.add(panelButton, BorderLayout.SOUTH);
panelFirst.setBackground(Color.white);
panelSecond.setBackground(Color.white);
panelContainer.add(panelFirst, "1");
panelContainer.add(panelSecond,"2");
panelContainer.add(panelThird,"3");
c1.show(panelContainer, "1");
btNext.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
c1.show(panelContainer,"2");
}
});
btNextTwo.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
c1.show(panelContainer,"3");
}
});
RadioButtons();
Button();
Buttons();
CheckList();
groupButton();
Image();
frame.add(panelContainer);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.pack();
frame.setSize(400,310);
frame.setVisible(true);
}
public void RadioButtons() {
btLdap = new JRadioButton ("Ldap");
btLdap.setBounds(60,85,100,20);
btLdap.setBackground(Color.white);
panelFirst.add(btLdap);
btKerbegos = new JRadioButton ("Kerbegos");
btKerbegos.setBounds(60,115,100,20);
btKerbegos.setBackground(Color.white);
panelFirst.add(btKerbegos);
btSpnego =new JRadioButton("Spnego");
btSpnego.setBounds(60,145,100,20);
btSpnego.setBackground(Color.white);
panelFirst.add(btSpnego);
btSaml2 = new JRadioButton("Saml2");
btSaml2.setBounds(60,175,100,20);
btSaml2.setBackground(Color.white);
panelFirst.add(btSaml2);
}
public void Button() {
btNext.setBounds(250,240,100,20);
}
public void CheckList () {
btSan = new JCheckBox ("San");
btSan.setBounds(60,85,100,20);
btSan.setBackground(Color.white);
panelSecond.add(btSan);
btNFS = new JCheckBox ("NFS");
btNFS.setBounds(60,115,100,20);
btNFS.setBackground(Color.white);
panelSecond.add(btNFS);
btYUMserver =new JCheckBox("Spnego");
btYUMserver.setBounds(60,145,100,20);
btYUMserver.setBackground(Color.white);
panelSecond.add(btYUMserver);
}
public void Buttons() {
btNextTwo.setBounds(250,240,100,20);
}
public void Image() {
ImageIcon image = new ImageIcon("iconpic.png");
lblPicture = new JLabel(image);
lblPicture.setBounds(140,5, 330, 270);
panelFirst.add(lblPicture);
ImageIcon imageTwo = new ImageIcon("iconpic.png");
lblPictureTwo = new JLabel(imageTwo);
lblPictureTwo.setBounds(140,5, 330, 270);
panelSecond.add(lblPictureTwo);
}
private void groupButton() {
ButtonGroup bg1 = new ButtonGroup( );
bg1.add(btLdap);
bg1.add(btKerbegos);
bg1.add(btSpnego);
bg1.add(btSaml2);
}
private static DefaultMutableTreeNode add(
final DefaultMutableTreeNode parent, final String text,
final boolean checked)
{
final CheckBoxNode data = new CheckBoxNode (text, checked);
final DefaultMutableTreeNode node = new DefaultMutableTreeNode(data);
parent.add(node);
return node;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new MyWizard();
}
});
}}
回答1:
It looks to me like you have some serious misunderstandings of the workings of GridBagLayout
. In your current code, there is only one JComponent
inside your GridBagLayout
... and that is btNextThree
.
Here is where you added it into the Grid.
panelButton.add(btNextThree, gbc);
"At the moment the button in panelButton is in the center but I just want to move it to the far right, what is the best way to do that?".
You can't do that with GridBagLayout... at least not the way you think. The cells in the Grid of GridBagLayout don't have a size until they have a component added to them, so where you have added btNextThree
to;
gbc.gridx = 1;
gbc.gridy = 0;
It is now in the right-most cell in a grid of two columns and one row. However, the left-most column has no size, as it only has potential space inside it. Therefore, your right column with btNextThree
inside takes up all available space.
So after all my babbling the short answer is that you should probably use another LayoutManager
. But if you want a quick dirty fix you could create a second invisible component of roughly the same size as btNextThree
and add it to the left most column, which would space them out evenly into two even columns. The below code should do that.
GridBagConstraints gbc2 = new GridBagConstraints();
gbc2.insets = new Insets(5,5,5,5);
gbc2.gridx = 0;
gbc2.gridy = 0;
panelButton.add(jButtonThatsSetToInvisible, gbc2);
If you later want them to stay correctly aligned within their container when resizing you may have to play with the GridBagConstraints
weight attributes, but that is for another post I think.
来源:https://stackoverflow.com/questions/18231995/why-is-the-gridbagconstraint-not-working