我正在使用秋千尝试制作一个垄断委员会。我试图将开发板上的属性/空间作为独立的JPanels放置,它们可以具有自己的实现,信息等,但是我在空间形状方面遇到了一些麻烦。我正在使用GridBagLayout(我对这个布局管理器还很陌生),并且我试图对面板进行布局,以使侧面JPanels的gridwidth = 4,gridheight = 3(请参阅随附的代码)。但是,当我运行并查看它时,面板是正方形的。我确认当我将gridheight更改为2或1时,这是行不通的,它仍然显示为正方形(我原本希望JPanels的形状是更长的长方形)。
原谅命名方案,在我在主要垄断程序中实现gui之前,我只是在Eclipse中一个单独的临时项目文件中尝试这种布局。
import static java.awt.GridBagConstraints.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
public class MainFrame extends JFrame {
private static final long serialVersionUID = 1L;
public MainFrame() {
super();
setDefaultCloseOperation(EXIT_ON_CLOSE);
Dimension screenSize = getToolkit().getScreenSize();
setSize(screenSize.height, screenSize.height);
setLocationRelativeTo(null);
setLayout(new GridBagLayout());
addCorners();
addEdges();
setVisible(true);
addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
System.out.println("Component resized");
int width = getWidth();
int height = getHeight();
System.out.println(width + " " + height);
super.componentResized(e);
}
});
}
private int startingColRow = 4;
private int endingColRow = 28;
private int bigWidth = 4;
private int smallWidth = 3;
private int startingEdge = 0;
private int endingEdge = 31;
private void addEdges() {
addLeftEdge();
addTopEdge();
addBottomEdge();
addRightEdge();
}
private void addCorners() {
addTopLeftCorner();
addBottomLeftCorner();
addTopRightCorner();
addBottomRightCorner();
}
private void addCorner(int anchor, int gridx, int gridy) {
add(getWhiteJPanel(), getGridBagConstraints(anchor, gridx, gridy, bigWidth, bigWidth));
}
private void addBottomRightCorner() {
addCorner(SOUTHEAST, endingEdge, endingEdge);
}
private void addTopRightCorner() {
addCorner(NORTHWEST, endingEdge, startingEdge);
}
private void addBottomLeftCorner() {
addCorner(SOUTHWEST, startingEdge, endingEdge);
}
private void addTopLeftCorner() {
addCorner(NORTHEAST, startingEdge, startingEdge);
}
public void addLeftEdge() {
for (int row = startingColRow; row <= endingColRow; row += smallWidth) {
add(getWhiteJPanel(), getGridBagConstraints(WEST, startingEdge, row, bigWidth, smallWidth));
}
}
public void addRightEdge() {
for (int row = startingColRow; row <= endingColRow; row += smallWidth) {
add(getWhiteJPanel(), getGridBagConstraints(EAST, endingEdge, row, bigWidth, smallWidth));
}
}
public void addBottomEdge() {
for (int col = startingColRow; col <= endingColRow; col += smallWidth) {
add(getWhiteJPanel(), getGridBagConstraints(SOUTH, col, endingEdge, smallWidth, bigWidth));
}
}
public void addTopEdge() {
for (int col = startingColRow; col <= endingColRow; col += smallWidth) {
add(getWhiteJPanel(), getGridBagConstraints(NORTH, col, startingEdge, smallWidth, bigWidth));
}
}
private static JPanel getWhiteJPanel() {
JPanel panel = new JPanel();
panel.setBackground(Color.WHITE);
panel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
return panel;
}
private GridBagConstraints getGridBagConstraints(int anchor, int gridx, int gridy, int gridwidth, int gridheight) {
GridBagConstraints c = new GridBagConstraints();
c.fill = VERTICAL;
c.weightx = c.weighty = 1;
c.anchor = anchor;
c.gridx = gridx;
c.gridy = gridy;
c.gridwidth = gridwidth;
c.gridheight = gridheight;
return c;
}
public static void main(String[] args) {
new MainFrame();
}
}
java大神给出的解决方案
我对您的c.fill = VERTICAL
有点困惑,我以为BOTH
。除此之外,如果窗口是正方形的,那么木板将具有正方形区域,如果窗口是长方形的,则将具有长方形区域。此处的Gridwidth和greighteight完全无关。相反,如果要使对象的面积在一个轴上重叠,则可以使用这些对象。最好将网格袋布局视为一个大网格。然后gridwidth和gridheight告诉布局给定对象应占据多少列或行。但是没有什么可说的是,列的宽度应与行的高度一样宽。实际上,没有什么可以说行或列具有相同的大小。所以我想说您对GridBagLayout的运行方式有一些不正确的想法。
如果要固定宽高比,则应为各个窗格设置首选尺寸,然后将整个板包装到滚动视图中。这样可以确保所有内容均以首选尺寸显示。不过,不确定滚动是否适合您的情况。如果没有,您可以尝试使用具有适当布局的外部容器,该布局将使内部容器增长到其首选大小,而不是更大。
java:继承 - java有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…
Java-如何将此字符串转换为日期? - java我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…
JAVA:如何检查对象数组中的所有对象是否都是子类的对象? - java我有一个对象数组。现在,我要检查所有这些对象是否都是MyObject的实例。有没有比这更好的选择:boolean check = true; for (Object o : justAList){ if (!(o instanceof MyObject)){ check = false; break; } } java大神给出的解决方案 如果您不喜欢循环,则…
如何使用BorderLayout(Java)扩展JTextField - java我有一个Java程序,其中使用的是JTextField,但如果我未指定默认大小,则其宽度为0。我将其插入BorderLayout中,因此如何制作它展开以填充整个容器? java大神给出的解决方案 在上面的示例中,文本字段将正常工作。但是,如果您插入EAST或WEST,则将不起作用。import java.awt.BorderLayout; import ja…
无法在Eclipse中调试条件中的最后一条语句? - javapublic static void main(String args[]) { if(true) { int x= 3*44+7; //int y=1; } } 我将问题缩小为这个简单的语句,我真的不知道如何在Eclipse调试器中访问此变量。它总是在以下情况下发生:在if条件中声明变量,try-catch语句,循环等,并且偶然地是该块中的最后一个语句。为…