2015-06-02 53 views
0

我試圖創建標記爲X-axis.Two問題數行:號線使用Java圖形API

  1. 一切正常0-9。但在此之後的任何事情,這些數字都會被壓縮在一起,並且不能在規模上正確定位。
  2. 我的主軸線趨於消失每次我嘗試我的最大化窗口或有時它只是不會在all.Every時間任何這些發生出現,我不得不重新編譯我的代碼,它工作得很好。

與上述問題的任何幫助,將不勝感激。

import java.awt.Graphics; 

import javax.swing.JFrame; 

/** 
* @author Emil Shirima 
* 
*/ 
public class Drawing extends JFrame { 

/** 
* @param args 
*/ 
int width = 300, height = 300, spacing = 10; 
int x1 = 0, y1 = 150, x2 = 300, y2 = 150; 

public Drawing() { 
    setTitle("Trial"); 
    setSize(width, height); 
    setVisible(true); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
} 

@Override 
public void paint(Graphics brush) { 
    brush.drawLine(x1, y1, x2, y2); 
    x1 = 10; 
    y1 = 150; 
    x2 = 10; 
    y2 = 130; 
    // brush.drawLine(x1, y1, x2, y2); 
    for (int i = 0; i < 12; ++i) { 
     String ID = Integer.toString(i); 
     x1 = x2 += spacing; 
     brush.drawLine(x1, y1, x2, y2); 
     if (i < 10) { 
      brush.drawString(ID, x1 - 3, y2 + 40); 
     } else { 
      // With the below implementation, the numbers overlap each other 
      // and are not properly oriented on the axis 
      brush.drawString(ID, x1 - 3, y2 + 40); 
      // TODO: I need to resize the numbers after 10 so as they fit 
      // properly on the scale 
     } 

    } 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    Drawing draw_object = new Drawing(); 

} 

當前實現:

enter image description here

最大化GUI:

enter image description here

+0

請參閱編輯回答。 –

回答

3

你的主要問題:

  • 你改變X1,您的繪製方法中X2,而這些變化會持續在接下來的繪畫。換句話說,你正在改變渲染方法中對象的狀態,這是你必須避免的。
  • 您正在使用「魔術」數字,使您的程序難以調試。

其他相關的問題:

  • 你在一個JFrame,一些Swing的繪畫教程告訴你到底沒有做到,因爲也有顯著的副作用風險,直接繪製。
  • 而是畫在JPanel的paintComponent方法裏面方法。
  • 你沒有調用任何超級繪畫方法,從而打破了繪畫鏈。

如果您希望數字線延伸通過組件,請在繪製方法(再次指定paintComponent)中獲取組件的大小,並使用它來幫助確定線的放置位置。

也可以考慮在一個小的FontMetrics灑水,以幫助將您的數字文本。例如,下面的代碼創建一個可實現的數行:

enter image description here

import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.FontMetrics; 
import java.awt.Graphics; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class SimpleNumberLinePanel extends JPanel { 

    private static final int PREF_W = 800; 
    private static final int PREF_H = 300; 
    private static final int GAP = 10; 
    private static final int START = 0; 
    private static final int END = 12; 
    private static final int VERT_LINE_HEIGHT = 20; 
    private static final Font FONT = new Font(Font.MONOSPACED, Font.BOLD, 14); 
    private static final int TEXT_GAP = 2; 

    @Override 
    protected void paintComponent(Graphics g) { 
     // call super method 
     super.paintComponent(g); 

     int width = getWidth(); 
     int height = getHeight(); 

     // initialize these guys each time paintComponent is called 
     int x1 = GAP; 
     int y1 = height/2; 
     int x2 = width - 2 * GAP; 
     int y2 = y1; 
     g.drawLine(x1, y1, x2, y2); 

     for (int i = START; i <= END; i++) { 
     int x = (i * (x2 - x1))/(END - START) + GAP; 
     drawNumberAndLine(g, i, x, y1, VERT_LINE_HEIGHT); 
     } 
    } 

    private void drawNumberAndLine(Graphics g, int number, int x, int y, 
     int vertLineHeight) { 
     int x1 = x; 
     int y1 = y; 
     int x2 = x; 
     int y2 = y - vertLineHeight; 
     g.drawLine(x1, y1, x2, y2); 

     String text = String.valueOf(number); 
     g.setFont(FONT); 
     FontMetrics fontMetrics = g.getFontMetrics(); 
     int textX = x - fontMetrics.stringWidth(text)/2; 
     int textY = y + fontMetrics.getHeight() + TEXT_GAP; 
     g.drawString(text, textX, textY); 
    } 

    @Override // make GUI bigger 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
     return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("Number Line"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new SimpleNumberLinePanel()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
+0

非常感謝。作爲Graphics API的新手,示例代碼非常有用,它幫助我更好地理解API。 – eshirima

+0

@EmilDavid:很高興它幫助,但請不要閱讀更重要的細節[搖擺繪畫教程](https://docs.oracle.com/javase/tutorial/uiswing/painting/)。 –