setVgap(0),setHgap(0)无法在gridlayout中工作?

时间:2014-05-26 13:15:51

标签: java swing layout-manager grid-layout

我正在尝试构建一个具有某些组件的应用程序,例如按钮,标签,文本字段,菜单栏和图片(我没有处理图像问题,因此没有代码)。

所以我为我的框架制作了一个网格布局,并构建了6个面板及其各自的组件,如下面的代码所示。但是当我运行它时,它不会显示任何东西,只是一个空白帧,除非我最大化窗口。因为当我这样做时,一切似乎都很好。除了2件事。

我将setVgap()setHgap()归零,但组件之间仍然存在差距。第二件事是BorderLayout.NORTH(..).SOUTH等似乎也不起作用。

public class Window extends JFrame {
 private static final long serialVersionUID = 1L;

 private JPanel menupanel = new JPanel();

 public Window() {

    super("Image Application");

    setLocationRelativeTo(null);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    requestFocus();

    // Setting Layout
    GridLayout grid = new GridLayout(6, 0, 0, 0);
    //grid.setVgap(0);
    //grid.setHgap(0);
    this.setLayout(grid);

    // Menu
    JMenuBar menubar = new JMenuBar();
    JMenu menu = new JMenu("Options");
    JButton button = new JButton("Reset");

    // Buttons
    menupanel.add(new JButton("Allign Left"));
    menupanel.add(new JButton("Allign Center"));
    menupanel.add(new JButton("Allign Right"));

    // Picture
    JPanel p1 = new JPanel();

    // 2x JLabels and ComboBoxes to get the preferred dimensions
    JPanel p2 = new JPanel();
    JPanel p3 = new JPanel();

    JLabel b2 = new JLabel("Width:  ");
    JLabel b3 = new JLabel("Height: ");

    JTextField box1 = new JTextField(25);
    JTextField box2 = new JTextField(25);

    // Resize Button
    JPanel p4 = new JPanel();
    JButton b4 = new JButton("Resize");

    // Adding Components to their panels
    p2.add(b2);
    p2.add(box1);
    p3.add(b3);
    p3.add(box2);
    p4.add(b4);
    menu.add(button);
    menubar.add(menu);

    // add all of the panels to JFrame
    this.add(menupanel);
    this.add(p1, BorderLayout.NORTH);
    this.add(p2, BorderLayout.SOUTH);
    this.add(p3, BorderLayout.WEST);
    this.add(p4, BorderLayout.EAST);
    this.setJMenuBar(menubar);
    pack();
    setVisible(true);

}

public static void main(String args[]) {

    Window w = new Window();

}
}

有什么想法吗?

~EDIT1根据前2条评论改变了pack();似乎解决了我需要最大化窗口以查看comp(-Thanks)的问题,但是setVgap()问题仍然存在。

~EDIT2当我运行它时会显示以下窗口: enter image description here

虽然我希望它看起来更像这样: enter image description here

再次忽略图片

~EDIT3好吧,我改变了Hgap的构造函数中传递的值,它确实相应地改变了不同的值,但似乎零Hgap仍然是~10像素宽?!另外我注意到,菜单栏和第一个Jbuttons之间的间隙没有变化,但仅适用于组件的返回。

~EDIT4它也适用于负int ..?!我迷失在这里......

1 个答案:

答案 0 :(得分:3)

  • 请比较,你应该使用GridLayout的第二个参数,然后setVgap()将有效(frame.setLayout(new GridLayout(6, 0, 5, 5));),这里只有零值,

    < / LI>
  • 窗口是Java中用于awt.Window的保留字,不要将此对象名称用作类名

enter image description here

import java.awt.Color;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class MyWindow {

    private static final long serialVersionUID = 1L;
    private JPanel menupanel = new JPanel();
    private JFrame frame = new JFrame("Image Application");

    public MyWindow() {
        // Menu
        JMenuBar menubar = new JMenuBar();
        JMenu menu = new JMenu("Options");
        JButton button = new JButton("Reset");
        // Buttons
        menupanel.add(new JButton("Allign Left"));
        menupanel.add(new JButton("Allign Center"));
        menupanel.add(new JButton("Allign Right"));
        // Picture
        JPanel p1 = new JPanel();
        p1.setBackground(Color.RED);
        // 2x JLabels and ComboBoxes to get the preferred dimensions
        JPanel p2 = new JPanel();
        p2.setBackground(Color.ORANGE);
        JLabel b2 = new JLabel("Width:  ");
        p2.add(b2);
        JTextField box1 = new JTextField(25);
        p2.add(box1);
        JPanel p3 = new JPanel();
        p3.setBackground(Color.BLUE);
        JLabel b3 = new JLabel("Height: ");
        JTextField box2 = new JTextField(25);
        p3.add(b3);
        p3.add(box2);
        // Resize Button
        JPanel p4 = new JPanel();
        p4.setBackground(Color.MAGENTA);
        JButton b4 = new JButton("Resize");
        // Adding Components to their panels
        p4.add(b4);
        menu.add(button);
        menubar.add(menu);
        // add all of the panels to JFrame
        frame.setLayout(new GridLayout(6, 0, 5, 5));        
        frame.add(menupanel);
        frame.add(p1);
        frame.add(p2);
        frame.add(p3);
        frame.add(p4);
        frame.setJMenuBar(menubar);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                MyWindow w = new MyWindow();
            }
        });
    }
}