Java 为什么gridbagconstraint不起作用
我使用了网格袋约束,当我使用插入添加间距时效果很好,但是当我使用gridx和gridy设置位置时,什么都没有发生。我刚刚发布了下面的全部代码,我不知道这是否有帮助,谢谢Java 为什么gridbagconstraint不起作用,java,swing,user-interface,gridbaglayout,Java,Swing,User Interface,Gridbaglayout,我使用了网格袋约束,当我使用插入添加间距时效果很好,但是当我使用gridx和gridy设置位置时,什么都没有发生。我刚刚发布了下面的全部代码,我不知道这是否有帮助,谢谢 import javax.swing.*;import java.awt.BorderLayout;import java.awt.CardLayout;importjava.awt.Color;import java.awt.GridBagConstraints;import java.awt.GridBagLayout;im
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();
}
});
}}
在我看来,您对
GridBagLayout
的工作原理有一些严重的误解。在当前代码中,GridBagLayout
中只有一个JComponent
。。。这就是btNextThree
这里是将其添加到网格中的位置
panelButton.add(btNextThree,gbc)代码>
“目前,panelButton中的按钮位于中间,但我只是
想把它移到最右边,最好的方法是什么
你不能用GridBagLayout做这个。。。至少不是你想的那样。GridBagLayout网格中的单元格只有在添加了组件后才会有大小,因此您将btNextThree
添加到其中
gbc.gridx = 1;
gbc.gridy = 0;
它现在位于两列一行网格中最右边的单元格中。但是,最左边的列没有大小,因为它内部只有潜在的空间。因此,您的右侧列(内有btNextThree
)将占用所有可用空间
因此,在我喋喋不休之后,简短的回答是您可能应该使用另一个LayoutManager
。但是,如果您想快速修复问题,可以创建第二个不可见组件,其大小与btNextThree
大致相同,并将其添加到最左侧的列中,这样可以将它们均匀地分隔为两个偶数列。下面的代码应该可以做到这一点
GridBagConstraints gbc2 = new GridBagConstraints();
gbc2.insets = new Insets(5,5,5,5);
gbc2.gridx = 0;
gbc2.gridy = 0;
panelButton.add(jButtonThatsSetToInvisible, gbc2);
如果以后在调整大小时希望它们在容器内保持正确对齐,您可能需要使用GridBagConstraints
weight属性,但我认为这是另一篇文章。需要更多的代码-您在哪里设置panelButton的LayoutManager?在组件面板按钮中布局了哪些其他组件?(顺便问一下,什么是panelButton?)您是否使用panelButton.setLayout(new GridBagLayout())
或其他方式设置了panelButton
的布局管理器?panelButton是一个JPanel,此面板位于另一个面板内,并设置为BorderLayout south,panelButton本身没有布局管理器,它只有一个JButtonI,有这个私有的JPanel panelButton=new JPanel(new GridBagLayout());另见