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