2008-12-21 52 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将负责绘制其本身及其所有子节点。