可调整大小的数字金字塔面板与秋千

时间:2012-09-20 09:58:10

标签: java swing jpanel stringbuilder

我正在尝试创建一个可调整大小的窗口,其中包含Swing和AWT组件,它们以金字塔形式显示数字,具体取决于框架的大小,但我不知道从哪里开始。我不确定我是否应该使用JLabel或StringBuilder。如果可以在不使用动作侦听器的情况下完成,那将是首选。我需要一些帮助。

1 个答案:

答案 0 :(得分:4)

我只需创建一个专用面板并覆盖方法paintComponent。然后使用FontMetrics和该面板的大小,我将迭代并用金字塔填充面板。

这是我提到的一个例子(尽管当数字位数增加时仍然存在问题,但我会让你解决这个问题):

import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;

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

public class TestPyramid {

    private static class PyramidPanel extends JPanel {
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setFont(new Font("Courier", Font.PLAIN, 11));
            FontMetrics fm = g.getFontMetrics();
            fm.getHeight();
            int i = 0;
            int y = 0;
            int n = 1;
            while (y + fm.getHeight() < getHeight()) {
                int x = getWidth() / 2;
                StringBuilder sb = new StringBuilder();
                for (int j = 0; j < 2 * i + 1; j++) {
                    String v = String.valueOf(n++);
                    sb.append(v);
                    for (int fill = 0; fill < 4 - v.length(); fill++)
                        sb.append(" ");
                }
                String text = sb.toString();
                int stringWidth = fm.stringWidth(text);
                if (stringWidth > getWidth()) {
                    break;
                }
                x -= stringWidth / 2;
                y += fm.getHeight();
                g.drawString(text, x, y);
                i++;
            }
        }
    }

    protected void initUI() {
        JFrame frame = new JFrame(TestPyramid.class.getSimpleName());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new PyramidPanel());
        frame.setSize(400, 200);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TestPyramid().initUI();
            }
        });
    }
}