0

我定义了一个新类 LShapePanel,它扩展了 JPanel,看起来像一个 L。

import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;

public class LShapePanel extends JPanel{

    public Color color;

    public LShapePanel(Color color) {
        this.color = color;
    }

    @Override
    public void paintComponent(Graphics g) {

        super.paintComponent(g);

        Graphics2D g2d = (Graphics2D) g;

        g2d.setColor(color);

        /* coordinates for polygon  */
        int[] xPoints = {0,100,100,20,20,0};
        int[] yPoints = {0,0,20,20,100,100};

        /* draw polygon */
        g2d.fillPolygon(xPoints, yPoints, 6);
    }
}

我想像这样安排其中两个 LShapePanel:

在此处输入图像描述

但我不知道怎么做?这是我连续排列两个 LShapePanel 的代码。

import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.JPanel;

import java.awt.Color;
import java.awt.Dimension;

public class DifferentShapes extends JFrame {

    public DifferentShapes() {

        setTitle("different shapes");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocation(500, 300);

        JPanel panel = new JPanel();

        /* create and add first L in red */
        LShapePanel lsp1 = new LShapePanel(new Color(255,0,0));
        lsp1.setPreferredSize(new Dimension(100,100));
        panel.add(lsp1);

        /* create and add second L in green*/
        LShapePanel lsp2 = new LShapePanel(new Color(0,255,0));
        lsp2.setPreferredSize(new Dimension(100,100));
        panel.add(lsp2);

        add(panel);

        pack();

    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                DifferentShapes df = new DifferentShapes();
                df.setVisible(true);
            }
        });
    }
}

结果:

在此处输入图像描述

4

2 回答 2

1

您需要使用layout manager来排列 JFrame 中的组件。根据this turorial,实际上包含您放入的组件的内容窗格默认JFrame使用Borderlayout。外观呈“L”形LShapePanel,实际上是一个矩形(swing中的每个组件实际上都是一个矩形),它的一部分是移植的。因此,如果您想以您想要的方式排列面板,它们必须相互重叠。不同类型的布局管理器使用不同的布局策略,并且Borderlayout不允许组件重叠,因此您必须更改为另一个布局管理器。抱歉,我不知道任何允许组件重叠的布局管理器,但您可以使用它JLayeredPane来实现您的目标。添加一个JLayeredPaneJFrame然后添加LShapePanelsJLayeredPane.

于 2013-08-03T10:49:04.917 回答
0

对不起,布局管理器爱好者,但我想不出除了使用setLocationnull布局管理器之外的任何方法。这是一个演示:

setLayout(null);
LShapePanel lsp1 = new LShapePanel(new Color(255,0,0));
lsp1.setPreferredSize(new Dimension(100,100));
lsp1.setLocation(0,0);
add(lsp1);

LShapePanel lsp2 = new LShapePanel(new Color(0,255,0));
lsp2.setPreferredSize(new Dimension(100,100));
lsp2.setLocation(30,30);
add(lsp2);
于 2013-08-03T10:40:42.203 回答