フレームのサイズに応じてピラミッド形式で数字を表示する Swing および AWT コンポーネントを使用してサイズ変更可能なウィンドウを作成しようとしていますが、どこから始めればよいかわかりません。JLabel と StringBuilder のどちらを使用するべきかわかりません。アクションリスナーを使用せずに実行できる場合は、それが望ましいでしょう。助けが必要です。
1 に答える
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();
}
});
}
}
于 2012-09-20T10:27:49.853 に答える