如何有效地使用网格或框布局? (正确?)

时间:2015-03-26 00:12:56

标签: java swing

如何使用网格或框布局来正确显示信息? (例如5名学生/行,3年级/小组)

我尝试过网格布局,效果很好。但是,它没有遵循我指定的行/列。我搞砸了诸如使用包含几个网格布局面板的框布局面板之类的东西。我已经撤消了一切,现在我回到原点。我现在请你帮忙。

Student: Test #1: Test #2: Test #3:
Name     100      50       75
Name     100      50       75
Name     100      50       75
Name     100      50       75
Name     100      50       75
etc...

^我想要实现的例子^

关于我之前所说的内容,在大约2-3行/学生之后,布局发生了变化并将分数分成如下:

Student: Test #1: Test #2: Test #3:  Name     100   75   25
Name     100      50       75        Name     75    20   10
Name     50       75       100       Name     100   40   32

如果您有任何想法,请告诉我。

代码:

public class GradesPanel extends JPanel
{


//Constructor
public GradesPanel()
{

    final int STUDENTS = 5;
    final int GRADES = 3;

    JTextField[] gradeField = new JTextField[GRADES];
    JPanel[] gradePanel = new JPanel[GRADES];
    JLabel[] gradeLabel = new JLabel[GRADES];
    JLabel[] header = new JLabel[GRADES + 1];
    JLabel[] nameLabel = new JLabel[STUDENTS];

    JPanel outerPanel = new JPanel();
    outerPanel.setLayout(new BorderLayout());

    JPanel innerPanel = new JPanel();
    innerPanel.setLayout(new GridLayout(STUDENTS, GRADES));

    //Create headers

    header[0] = new JLabel("Student:");
    innerPanel.add(header[0]);
    for(int col = 1; col < (GRADES+1); col++)
    {   
        header[col] = new JLabel("Test #" + (col));
        innerPanel.add(header[col]);
    }


    //Create Label/TextField for each student/grade
    for(int row = 0; row < STUDENTS; row++)
    {
        nameLabel[row] = new JLabel("Name");
        innerPanel.add(nameLabel[row]);
        for(int col = 0; col < GRADES; col++)
        {   
            //gradeLabel[col] = new JLabel("");
            gradeField[col] = new JTextField(3);
            //innerPanel.add(gradeLabel[col]);
            innerPanel.add(gradeField[col]);
        }
    }

    //outerPanel.setPreferredSize(new Dimension(300,100));
    //outerPanel.add(innerPanel, BorderLayout.CENTER);
    //add(outerPanel);
    add(innerPanel);
}   
}

1 个答案:

答案 0 :(得分:2)

这不应该使用布局管理器来解决,布局管理器用于帮助您组织组件,而不是显示数据。您的问题是如何显示表格数据,而不是组件,并立即想到两个解决方案:

  1. 使用带有等宽字体(Font.MONOSPACED)的JTextArea,并使用String.format("...",...)格式化数据行,甚至更好:
  2. 使用JTable显示数据。该组件已经专门构建,以显示和操作表格数据。可以找到该教程here