JComponent.setBound错误位置的最后一个JComponent

时间:2012-04-13 20:30:56

标签: java swing user-interface

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

notebook image http://homepages.ius.edu/rwisman/C201/html/ch4-2.jpg

我在下面的课程中尝试做的所有事情都是画出一些带有数字的矩形。并翻译它们,但最后一个矩形绘制为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);
        }
    }
}   

2 个答案:

答案 0 :(得分:3)

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

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

附录:每当有人试图使用Absolute Positioning时,JInternalFrame可能是另一种选择。可以找到相关示例herehere

附录:如果项目超出原型阶段,还要考虑Custom Layout Manager

答案 1 :(得分:2)

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

至于解决方案,为什么不在图片上绘制所有矩形并在循环结束时更新它?或者是在演示中添加JPanel部分?