2008-12-21 79 views
-2

我在GenerateButton類的末尾添加了點,但現在我得到了我的公共double [] []矩陣,所有點都在哪裏,我從哪裏開始繪製它們?我應該從哪裏開始繪畫? (Java,GUI)

我Main.java:

import java.awt.*; 
import javax.swing.*; 

public class Main { 
    public static Display display = new Display(); 

    public static void main(String[] args) { 
     display.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     display.setVisible(true); 
    } 
} 

我Display.java:

import java.awt.*; 
import java.awt.event.*; 
import java.awt.dnd.*; 
import java.util.Vector; 

import javax.swing.*; 

public class Display extends JFrame { 
    final int FRAME_WIDTH = 910; 
    final int FRAME_HEIGHT = 660; 
    final int X_OFFSET = 40; 
    final int Y_OFFSET = 40; 

    final int GRAPH_OFFSETX = 15; 
    final int GRAPH_OFFSETY = 40; 
    final int GRAPH_WIDTH = 500; 
    final int GRAPH_HEIGHT = 500; 
    final int GRAPH_INTERVAL = 20; 

    JButton submit; 
    JTextField numPoint; 
    JPanel bpanel; 
    JPanel points; 
    Vector<JTextField> pointsA = new Vector<JTextField>(); 
    int maxPoints; 
    public double[][] matrix; 

    public Display() { 
     init(); 
    } 

    public void init() { 
     setBackground(Color.WHITE); 
     setLocation(X_OFFSET, Y_OFFSET); 
     setSize(FRAME_WIDTH, FRAME_HEIGHT); 
     setTitle("Geometric Transformations"); 
     getContentPane().setLayout(null); 
     setDefaultLookAndFeelDecorated(true); 

     numPoint = new JTextField(); 
     numPoint.setText("# Points?"); 
     numPoint.setBounds(530,200,120+20,25); 

     SubmitButton submit = new SubmitButton("Submit"); 
     submit.setBounds(530+150, 200, 100, 25); 

     GenerateButton submitC = new GenerateButton("Generate"); 
     submitC.setBounds(530-5, 200+130, 100, 25); 

     points = new JPanel(new GridLayout(2,2)); 
     points.setBounds(530, 200+40,100+270,80); 

     this.add(numPoint); 
     this.add(submit); 
     this.add(submitC); 
     this.add(points, BorderLayout.LINE_START); 

     repaint(); 
    } 

    public void paint(Graphics g) { 
     super.paint(g); 
     g.setColor(Color.WHITE); 
     g.fillRect(100, 100, 20, 30); 
     g.setColor(Color.BLACK); 
     genGraph(g, GRAPH_OFFSETX, GRAPH_OFFSETY, 
       GRAPH_WIDTH, GRAPH_HEIGHT, GRAPH_INTERVAL); 
    } 

    public void genGraph (Graphics g, int x, int y, 
          int width, int height, int interval) { 
     // draw background 
     int border = 5; 
     g.setColor(Color.BLACK); 
     width = width - (width % interval); 
     height = height - (height % interval); 
     for (int col=x; col <= x+width; col+=interval) { 
      g.drawLine(col, y, col, y+height); 
     } 
     for (int row=y; row <= y+height; row+=interval) { 
      g.drawLine(x, row, x+width, row); 
     } 
    } 
    class SubmitButton extends JButton implements ActionListener { 

     public SubmitButton(String title){ 
      super(title); 
      addActionListener(this); 
     } 
     public void actionPerformed (ActionEvent e) { 
      maxPoints = Integer.parseInt(numPoint.getText()) * 2; 

      points.removeAll();  // clear JPanel so results from last aren't appended to 
           // delete this line and first enter 2 then 10 for # points 
      for (int i=0; i<maxPoints; i++) { 
       JTextField textField = new JTextField(); 
       points.add(textField);  // add to JPanel that gets displayed 
       pointsA.add(textField);  // for getting values from later 
      } 

      matrix = new double[2][pointsA.size()/2];  // setting up dimension of matrix double[][] 

      points.validate(); 
      points.repaint(); 

      // What to Check: 
      // Things between commas are either spaces (which will be stripped later) 
      // or numbers! 

      // Pairs must match up! 
     } 
    } 
    class GenerateButton extends JButton implements ActionListener { 
     public GenerateButton (String title) { 
      super(title); 
      addActionListener(this); 
     } 
     public void actionPerformed (ActionEvent e) { 
      int c=0; 
      for (int i=0; i<pointsA.size()/2; i++) { 
       JTextField pointTF = pointsA.get(i); 
       Double point = Double.parseDouble(pointTF.getText()); 
       matrix[0][c] = point; 
       c++; 
      } 
      c=0; 
      for (int i=pointsA.size()/2; i<pointsA.size(); i++) { 
       JTextField pointTF = pointsA.get(i); 
       Double point = Double.parseDouble(pointTF.getText()); 
       matrix[1][c] = point; 
       c++; 
      } 
      for (int i=0; i<matrix.length; i++) { 
       for (int j=0; j<matrix[0].length; j++) { 
        System.out.println("i:"+i+"\t"+"j:"+j); 
        System.out.println("  "+matrix[i][j]); 
       } 
      } 
     } 
    } 
} 

回答

4

我不太確定到底你在問什麼。通常,您將所有繪圖功能都放在paint()方法中。但是,您通常希望保留AWT調度線程的任何長時間運行的工作,該線程與您的按鈕的actionPerformed()方法所調用的線程相同。爲了保持程序的響應,您可能需要將其委託給SwingWorker。

如果您的應用程序未顯示,則可能是因爲您在JPanel初始化期間沒有調用pack()和show()(按此順序)。一般來說,你應該把它作爲init()方法中的最後一件事。之後添加組件或在AWT線程中更改組件狀態之後,可能會導致AWT生氣並引發異常。

如果你問自己如何繪製點,你應該看看Graphics.drawPolyline()和相關的方法,你應該從paint()方法中調用它們。

如果你問如何從按鈕處理程序中繪製它們,你不需要。您可以調用repaint()並讓對象在自己的時間重新繪製自己。此外,在你的情況下,我不會打擾JButton的子類。只需實現actionListener。在init()方法中,只需創建兩個按鈕並向他們註冊監聽器。這也意味着你不必重載他們的構造函數。另外,你在你的init()方法中掩碼提交:它從不被引用,也不是bpanel。另外,我會使用單獨的X和Y數組,而不是試圖將它們組合成單個矩陣。你不需要聲明矩陣是公開的,因爲內部類已經可以看到它了。事實上,您可以(也可能應該)將所有字段聲明爲私有。你也有太多的魔法數字在浮動,你正在與Swing的方式戰鬥太多:只是讓它做這是把所有的東西放在外面的工作。你也應該試着展示一個最小的問題,這個問題可以讓我們回答你的問題:這是一種流遍各處的流量,很難遵循。

呵呵,也是你的線條沒有被繪製的真正原因:你在你的JPanel上調用重畫,而不是你想繪製的JFrame。如果您只是調用repaint()而不是points.repaint(),則JFrame將負責繪製其本身及其所有子節點。