Java 矩形的显示顺序,可以更改吗?

Java 矩形的显示顺序,可以更改吗?,java,graphics2d,Java,Graphics2d,我正在从事一个项目,其中我必须模拟内存管理器并显示一些内存快照。我通过在这里找到的示例创建了一个draw类,在这些示例中我重写了paintComponet。一切都很好 我希望能够画一个矩形来表示内存分区,然后在上面覆盖另一个矩形来表示传入的作业,即Job1在这个分区3中。似乎发生的是,我首先添加了分区,这将始终是这样,然后当我添加作业时,它将位于分区块后面。除了先绘制作业外,是否有其他方法在创建作业后移动这些作业 这是油漆覆盖 @Override public void paintCompone

我正在从事一个项目,其中我必须模拟内存管理器并显示一些内存快照。我通过在这里找到的示例创建了一个draw类,在这些示例中我重写了paintComponet。一切都很好

我希望能够画一个矩形来表示内存分区,然后在上面覆盖另一个矩形来表示传入的作业,即Job1在这个分区3中。似乎发生的是,我首先添加了分区,这将始终是这样,然后当我添加作业时,它将位于分区块后面。除了先绘制作业外,是否有其他方法在创建作业后移动这些作业

这是油漆覆盖

@Override public void paintComponent(Graphics g) {

    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D)g;

    // set up rendering to allow anti-aliasing
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

    // create the rectangle to represent the memory partition block 
    //  x = address position h = amount of memory (y & w are predefined for the display block)

      Rectangle2D rect = new Rectangle2D.Double(x, y, w, h);    // create the rectangle 
    g2d.setPaint(partColor);                // set it's color
    g2d.fill(rect);                 // fill it in

    // create the transparency for the text
     Composite comp = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, .4f);
     g2d.setComposite(comp);

     // draw the text with color, type and size and center the text in the block created above
     g2d.setPaint(Color.black);
     g2d.setFont(new Font("Tahoma", Font.PLAIN, 12));
     g2d.drawString(text, (int)((w / 2) - (text.length()/2)), (int)h/2);

}
对draw的调用在我的window类中,这将把分区放在作业前面,但我需要在不更改调用顺序的情况下反转顺序

    // Draw both Text and Block with transparency
    DrawPartition part1 = new DrawPartition(Color.blue, 0, 0, 110, 100, "part1");
    part1.setBounds(5, 5, 110, 100);
    snapPanel.add(part1);

    DrawJob job1 = new DrawJob(Color.green, 0, 0, 110, 100, "Job 1");
    job1.setBounds(5, 15, 110, 100);
    snapPanel.add(job1);

你为什么不能这么做

// Draw both Text and Block with transparency
DrawPartition part1 = new DrawPartition(Color.blue, 0, 0, 110, 100, "part1");
part1.setBounds(5, 5, 110, 100);

DrawJob job1 = new DrawJob(Color.green, 0, 0, 110, 100, "Job 1");
job1.setBounds(5, 15, 110, 100);
snapPanel.add(job1);

snapPanel.add(part1);

更一般的答案是在每个矩形中添加一个z分量。然后,您可以在paintComponent方法中循环绘制矩形,并按z顺序绘制它们。

Gilbert,问题是在选择内存方案时绘制分区,并且在固定内存分区方案的情况下显示分区。随后将创建和分发作业,以模拟作业队列内外的处理。@jbolt:将矩形的创建与矩形的绘制分开。创建分区矩形,然后随时间创建并销毁作业矩形。在paintComponent中,清除绘图区域,绘制分区矩形,然后绘制作业矩形。我将使用它玩一会儿,看看我能想出什么。这是朝着正确方向迈出的一步。一个好方法是创建这些对象并将它们存储在数组列表[]中。通过这种方式,我可以按对象出现的顺序添加对象Job1、Part3、Job2、Part5,然后创建一个循环,在添加到列表时显示在快照面板中?@jbolt:这是正确的想法。我将使用两个ArrayList,一个用于分区矩形,另一个用于作业矩形。在paintComponent中,您将有两个绘图循环,一个用于分区矩形,一个用于作业矩形。也许我没有正确地描述这一点。。。我发现在快照面板中显示这些时遇到了一个问题。如果我从窗口构造函数中创建作业对象并调用snapPanel.addJob,它们会显示得很好,但是当我从另一个名为FixedPartition的类中调用它时,我在该类中创建了包含分区地址、大小和状态空闲或忙的分区,我还试图在快照面板中创建和显示这些块。我如上所述创建对象,调用part.setBoundsboundInfo,然后调用mw.snapPanel.addobject。这个数字正确吗?