如何在Java的图层中绘制组件?

时间:2018-12-30 20:23:29

标签: java swing graphics jframe jpanel

我在对应用程序的图形部分进行编码时遇到了很大的问题,我需要使组件彼此重叠:

  1. 首先我有JFrame(具有固定大小)

  2. 其中有两个JPanel组件。我希望他们有彩色背景。 那是容易的部分。

  3. JPanel组件之一上,我想绘制固定的阴影-矩形,车道等。在这里,我有一个问题,我有两个类:一个扩展JPanel并且是背景在本部分中,第二部分扩展JComponent并表示我绘制的元素(有多个元素)。我不知道如何在JPanel中绘制元素-我尝试了几种方法,但未显示任何内容。对我来说重要的是,仅应使用此JPanel而不是整个框架来绘制和连接JComponent。

  4. 最重要的是,我想要移动形状。当我只有框架并说成矩形时,这很容易,因为我只更改位置并调用repaint()方法,但是如何使移动的形状连接到JPanel并在import javax.swing.*; import java.awt.*; import java.util.ArrayList; public class Main{ public Main() { JFrame frame = new JFrame(); frame.setSize(1200, 900); frame.setResizable(false); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); JPanel background = new JPanel(); background.setBackground(Color.lightGray); GreenRect gr = new GreenRect(); gr.setPreferredSize(new Dimension(500,800)); background.add(gr, BorderLayout.WEST); RedRect rr = new RedRect(); rr.setPreferredSize(new Dimension(500,800)); background.add(rr, BorderLayout.EAST); frame.add(background); } public static void main(String[] args) { new Main(); } } class GreenRect extends JPanel { ArrayList<BlackRect> r = new ArrayList<>(); ArrayList<MovingRec> m = new ArrayList<>(); public GreenRect() { setBackground(Color.green); addRec(10,10); addRec(50,50); addRec(100,100); addRec(1000,1000); } public void addRec(int x, int y) { r.add(new BlackRect(x,y)); } } class RedRect extends JPanel { public RedRect() { setBackground(Color.red); } } class BlackRect extends JComponent { int x, y; int w = 100, h = 100; public BlackRect (int x, int y){ this.x = x; this.y = y; } @Override public void paintComponent(Graphics g) { super.paintComponents(g); Graphics2D g2d = (Graphics2D) g; g2d.setColor(Color.BLACK); g2d.fillRect(x, y, w, h); } } class MovingRec extends JComponent { int x, y; int w = 20, h = 20; public MovingRec (int x, int y){ this.x = x; this.y = y; } public void paintComponent(Graphics g) { super.paintComponents(g); Graphics2D g2d = (Graphics2D) g; g2d.setColor(Color.BLUE); g2d.fillRect(x, y, w, h); } public void update() { x += 5; y += 5; } } 内和向左以前的图层在他们的位置?

我尝试创建一些带有矩形的类:

tagName

现在我在第3点和第4点有问题,因为我不能在背景上放置黑色矩形,而不能在顶部放置移动矩形。

我将感谢所有帮助:)

1 个答案:

答案 0 :(得分:1)

您不需要(也不应该)从BlackRect扩展MovingRectJComponent

例如,BlackRect可以是一个简单的对象,例如:

class BlackRect {
    int x, y;
    int w = 100, h = 100;

    public BlackRect(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public void paint(Graphics2D g2d) {
        g2d.setColor(Color.BLACK);
        g2d.fillRect(x, y, w, h);
    }
}

您应该覆盖GreenRect的绘制方法,以便在该面板上绘制矩形:

public GreenRect extends JPanel {
    // Existing members 

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        Graphics2D g2d = (Graphics2D) g;

        for (BlackRect black_rect : r) {
            black_rect.paint(g2d);
        }

        // Also paint list of moving rectangles here
    }
}

调用GreenRect.repaint()时,它将绘制其背景以及r(和添加该代码的m列表中的所有矩形)。如果m矩形的位置已更新,则会在新位置绘制它们,因此它们似乎正在移动。由于移动矩形是最后绘制的,因此它们将显示在“顶部”。

使用秋千Timer驱动动画。计时器到期后,它应稍微移动所有移动的矩形(即,调用MovingRec.update()),并在repaint()上调用GreenRect