2012-09-20 73 views
0

我想創建一個可調整大小的窗口,以Swing和AWT組件顯示數字,金字塔時間取決於框架的大小,但我不知道從哪裏開始。我不確定我是否應該使用JLabel或StringBuilder。如果可以在不使用動作偵聽器的情況下完成,那將是首選。我需要一些幫助。可調整大小的數字金字塔面板與Swing

回答

4

我會簡單地創建一個專用面板並覆蓋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(); 
      } 
     }); 
    } 
} 
+0

我有「固定」的數量數字問題 – brimborium

+0

@brimborium數字數量增加時仍然存在一個小故障(當它超過100時尤其明顯)。在循環中使用字符串連接並不是一個好主意,它應該重用現有的StringBuilder。另外,請不要重新命名我的SSCCE班?我覺得有一個有意義的類名比「Main」更有用。這也允許我複製/粘貼代碼而不擦除以前的SSCCE。謝謝 –

+0

好的,我修復了類重命名,它現在使用'StringBuilder'來連接。但是,是的,一旦價值超過1k,問題仍然存在。估計可以顯示多少個數字並從中計算最大的字符串寬度是可能的。我只是應用了一個簡單的修復,每個數字的寬度不變。如果OP希望它是動態的,他可以從你的代碼工作。 – brimborium