0
我想創建一個可調整大小的窗口,以Swing和AWT組件顯示數字,金字塔時間取決於框架的大小,但我不知道從哪裏開始。我不確定我是否應該使用JLabel或StringBuilder。如果可以在不使用動作偵聽器的情況下完成,那將是首選。我需要一些幫助。可調整大小的數字金字塔面板與Swing
我想創建一個可調整大小的窗口,以Swing和AWT組件顯示數字,金字塔時間取決於框架的大小,但我不知道從哪裏開始。我不確定我是否應該使用JLabel或StringBuilder。如果可以在不使用動作偵聽器的情況下完成,那將是首選。我需要一些幫助。可調整大小的數字金字塔面板與Swing
我會簡單地創建一個專用面板並覆蓋paintComponent方法。然後使用FontMetrics和該面板的大小,我會迭代並用金字塔填充面板。
這裏是什麼,我mentionning(雖然還有當數字的數量增加,但我會讓你解決這個問題的一個問題)的例子:
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();
}
});
}
}
我有「固定」的數量數字問題 – brimborium
@brimborium數字數量增加時仍然存在一個小故障(當它超過100時尤其明顯)。在循環中使用字符串連接並不是一個好主意,它應該重用現有的StringBuilder。另外,請不要重新命名我的SSCCE班?我覺得有一個有意義的類名比「Main」更有用。這也允許我複製/粘貼代碼而不擦除以前的SSCCE。謝謝 –
好的,我修復了類重命名,它現在使用'StringBuilder'來連接。但是,是的,一旦價值超過1k,問題仍然存在。估計可以顯示多少個數字並從中計算最大的字符串寬度是可能的。我只是應用了一個簡單的修復,每個數字的寬度不變。如果OP希望它是動態的,他可以從你的代碼工作。 – brimborium