我正在尝试构建一个具有一些组件的应用程序,例如按钮,标签,文本字段,菜单栏和图片(我还没有解决图像问题,因此尚无代码)。
因此,我为框架制作了网格布局,并按照代码波纹管中的说明构造了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/