2

我最近在使用 Swing 时遇到了一些问题。我正在尝试制作类似于下图中的内容,以说明算法的数据结构。

笔记本图片
(来源:ius.edu

在接下来的课程中,我所做的只是画出一些带有数字的矩形。并平移它们,但是最后一个矩形绘制在 0,0 处。我难住了。

如果JPanel在循环之后添加(注释掉),那么它会按预期绘制。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class DrawingRect {

    public static void main(String[] args) {
        DrawingRect d = new DrawingRect();
    }

    public DrawingRect() {

        JFrame frame = new JFrame("Drawing a rect");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel swingPanel = new JPanel();
        swingPanel.setPreferredSize(new Dimension(500, 500));

        swingPanel.setVisible(true);

        swingPanel.setLayout(new BorderLayout(0, 0));

        int base = 15;
        for (int i = 1; i <= 25; i++) {
            Graphic re = new Graphic(i);

            //translating the graphic
            re.setBounds(base + 30 * i, base + 20 * i, 110, 110);


            swingPanel.add(re);
        }


        // if say I add a JPanel in here as the last element
        // then the boxes will draw correctly.
        //swingPanel.add(new JPanel());

        swingPanel.setPreferredSize(new Dimension(800, 600));

        frame.getContentPane().add(swingPanel);

        frame.pack();
        frame.setVisible(true);
    }

    public class Graphic extends JComponent {

        private static final long serialVersionUID = 1L;
        private static final int PREF_W = 100;
        private static final int PREF_H = 100;
        int id;

        public Graphic(int id) {
            this.id = id;
        }

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

            Graphics2D g2 = (Graphics2D) g;
            g2.setColor(Color.black);

            g2.setColor(Color.black);
            g2.drawRoundRect(0, 0, 30, 30, 20, 20);

            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);

            Font font = new Font("", Font.PLAIN, 13);
            g2.setFont(font);

            g2.drawString("" + id, 15, 20);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(PREF_W, PREF_H);
        }
    }
}   
4

2 回答 2

3

的默认布局是,但是您将组件定位为就好像布局JPanel是。此外,您正在绘制嵌套组件可以自动执行的内容。FlowLayoutnull

相反,将几个JPanel包含JLabel's 的 s 添加到具有GridLayout. 根据需要使用空面板。在外部面板中覆盖paintComponent()以绘制连接线。

附录:任何时候都想使用绝对定位JInternalFrame可能是另一种选择。相关示例可在此处此处找到。

附录:如果项目超出原型阶段,还可以考虑使用自定义布局管理器

于 2012-04-13T21:01:38.797 回答
2

这是因为您使用的是 BorderLayout。您可以通过更改添加行以包含特定布局位置来测试这一点:swingPanel.add(re,BorderLayout.SOUTH).

至于解决方案,为什么不在图片上绘制所有矩形并在循环结束时对其进行更新?或者添加到 JPanel 是您演示的一部分吗?

于 2012-04-13T21:20:34.797 回答