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

因此,我为框架制作了网格布局,并按照代码波纹管中的说明构造了6个面板及其各自的组件。但是,当我运行它时,它一开始不会显示任何内容,只是空白帧,除非我最大化窗口。因为当我这样做时,一切似乎都工作正常。除了两件事。

我将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会显示以下窗口:


虽然我希望它看起来像这样:


再次忽略图片

〜EDIT3好吧,我更改了在构造函数中为Hgap传递的值,并且确实对不同的值进行了更改,但似乎零Hgap仍约为10像素宽?我还注意到菜单栏和第一个Jbutton之间的间隙并没有改变,而只是针对组件的其余部分。

〜EDIT4它也适用于负整数。我在这里迷路了。

最佳答案

请进行比较,您应该为GridLayout使用第二个参数,然后setVgap()将起作用(frame.setLayout(new GridLayout(6, 0, 5, 5));),这里只有零值,
Window在Java中是awt.Window的保留字,请勿将此对象名称用作类名称




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();
            }
        });
    }
}

关于java - setVgap(0),setHgap(0)在gridlayout中不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23871041/

10-09 03:27