我正在尝试创建一个程序,使学校项目的楼层布局计划的创建变得容易。用户可以输入建筑物的尺寸,然后将其描绘为标签网格,可以通过单击标签将其转换为墙壁,窗户或门。因为墙,窗和门具有不同的外观,材料等,所以我为每个创建了单独的类,所有这些都扩展了buildingObject。为了让它首先工作,我只关注在表单上获取构建对象。
package building.pkg3d.printer;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class buildingObject {
private int x;
private int y;
private int rotation;
private javax.swing.JLabel jLabel = new javax.swing.JLabel("wohnvipowa");
private static final int WIDTH = 10;
private static final int HEIGHT = 100;
public buildingObject(int x, int y, int rotation, JPanel p) {
this.x = x;
this.y = y;
this.rotation = rotation;
initLabel(p);
}
public void initLabel(JPanel p)
{
jLabel.setLocation(x, y);
if (rotation == 1)
jLabel.setPreferredSize(new Dimension(WIDTH, HEIGHT));
else
jLabel.setPreferredSize(new Dimension(HEIGHT, WIDTH));
jLabel.setBackground(Color.BLACK);
jLabel.setOpaque(true);
p.add(jLabel);
p.validate();
System.out.println("jLabel added to panel");
System.out.println("jLabel at: " + jLabel.getX() + ", " + jLabel.getY());
System.out.println("");
jLabel.setVisible(true);
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public int getRotation() {
return rotation;
}
public JLabel getjLabel() {
return jLabel;
}
@Override
public String toString() {
return "buildingObject{" + "x=" + x + ", y=" + y + ", rotation=" + rotation + ", jLabel=" + jLabel + '}';
}
}
我正在空表上快速测试它
package building.pkg3d.printer;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import javax.swing.JPanel;
public class labelTester extends javax.swing.JFrame {
private buildingObject[][] matrix;
/**
* Creates new form labelTester
*/
public labelTester() {
initComponents();
initLayout(1500,1500);
System.out.println(this.getContentPane().getComponentAt(0, 0).toString());
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 514, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 426, Short.MAX_VALUE)
);
pack();
}// </editor-fold>
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(labelTester.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(labelTester.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(labelTester.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(labelTester.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new labelTester();
}
});
}
private void initLayout(int w, int l)
{
int numRows = l / 100;
int numCol = w / 100;
matrix = new buildingObject[numRows][numCol];
JPanel p = new JPanel();
for(int i = 0; i < matrix.length; i++)
{
for(int j = 0; j < matrix[i].length; j++)
{
matrix[i][j] = new buildingObject(i * 100, j * 100, 1, p);
}
}
this.add(p, BorderLayout.NORTH);
this.pack();
this.setVisible(true);
}
// Variables declaration - do not modify
// End of variables declaration
}
但是每当我运行程序时,标签都存在,但它们不会出现。我需要能够将标签放在特定的x和y值,所以我不相信我可以使用布局。我该怎么做才能让我的标签显示出来?或者有更好的方法来做到这一点,我不知道吗?
答案 0 :(得分:2)
我需要能够将标签放置在特定的x和y值,因此我不相信我可以使用布局。
正确。
但是,您的代码存在问题,因为您不了解使用布局管理器的基础知识,并且您正在使用IDE来生成代码。
在initComponents()
方法中,您的IDE生成代码:
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
这意味着您使用的是GroupLayout
。
在您使用的initLayout()
方法中:
this.add(p, BorderLayout.NORTH);
所以你假设布局管理器是BorderLayout
,但事实并非如此。如果要将面板添加到框架,则需要使用GroupLayout
所需的所有约束。由于您没有使用适当的约束,因此面板永远不会显示,您将看不到添加到面板中的组件。
最后,默认情况下,JPanel使用FlowLayout,因此当您将BuildObjects添加到面板时,它们将根据布局管理器的规则进行定位。
所以你真正需要做的就是重新开始。我建议不要使用IDE来生成GUI代码,而是手动创建GUI,以便在需要时控制布局管理器。
然后,对于包含BuildObjects的面板,您将需要使用null布局。然后,您将负责设置您添加到面板的组件的size
和location
。
现在使用null布局通常不是一个好主意,因为Swing旨在与布局管理器一起使用,因此pack()方法可以确定面板的首选大小,滚动将正常工作。
因此,为了让生活更轻松,您可以使用Drag Layout。它允许随机定位组件,但它将实现布局管理器的其他功能。