2013-03-09 45 views
1

我开始通过添加基本代码来了解工作原理,从而完成作业编号#3。但我无法摆脱这个问题。我只是添加了一个“if”,这样如果输入文本等于“hr”,那么龟每次都会向右移动2格。但是当我运行代码时,就好像它只检查第一个字符。如果前两个字符是“hr”,那么它会标记一个点,但如果不是,它将不再检查输入。因此,例如,如果我写:如何让DocumentListener在每行之后进行比较,而不仅仅是程序运行一次?

re 
Fd 
hr 

它从来没有标记的点,即使“小时”在那里。我能做些什么,以便TurtleRenderer每次插入\ n时读取行,而不仅仅是代码运行一次?

我的代码:

package turtle; 

public class BoardMaker { 

    private static int MAX = 100; 
    private boolean[][] board = new boolean[MAX][MAX]; 
    int previousX = 0; 
    int previousY = 0; 

    public boolean[][] makeBoardFrom(String description) {  
     if(description.contentEquals("hr")){ 
      previousX+=2; 
      board[previousX][previousY]=true; 
     } 
     return board; 
    } 

    public boolean[][] initialBoard() { 
     for(int i=0;i<MAX;i++) 
     { 
      for(int j=0;j<MAX;j++) 
       board[i][j]=false; 
     } 
     return board;  
    } 
} 

的TurtleRenderer类:

package turtle; 

public class TurtleRenderer extends Panel implements DocumentListener { 

    private static final long serialVersionUID = 1; 

    static final Dimension WINDOW_SIZE = new Dimension(1150, 1150); 

    boolean [][] board; 
    final BoardMaker boardMaker; 

    public TurtleRenderer() { 
     boardMaker = new BoardMaker(); 
     board = boardMaker.initialBoard(); 
    } 

    static public void main(String args[]) throws Exception { 
     JFrame frame = new JFrame("Display image"); 
     JPanel panel = new JPanel(); 
     TurtleRenderer image = new TurtleRenderer(); 
     image.setPreferredSize(WINDOW_SIZE); 
     JScrollPane textArea = makeTextArea(image); 
     panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS)); 
     panel.add(image); 
     buildRightPanel(panel, textArea); 
     frame.setSize(WINDOW_SIZE); 
     frame.addWindowListener(new WindowAdapter(){ 
      public void windowClosing(WindowEvent we){ 
       System.exit(0); 
      }}); 
     frame.getContentPane().add(panel); 
     frame.setVisible(true); 
    } 

    static void buildRightPanel(JPanel panel,JComponent textArea) { 
     JLabel label = new JLabel("Your program:"); 
     label.setPreferredSize(new Dimension(150, 20)); 
     JPanel right = new JPanel(); 
     textArea.setPreferredSize(new Dimension(150,500)); 
     right.setLayout(new BoxLayout(right, BoxLayout.Y_AXIS)); 
     right.add(label); 
     right.add(textArea); 
     panel.add(right); 
    } 

    public void paint(Graphics g) { 
     Graphics2D g2d = (Graphics2D)g; 
     g2d.setColor(Color.white); 
     g.fillRect(0, 0, WINDOW_SIZE.width, WINDOW_SIZE.width); 
     if(board == null) 
      return; 
     g2d.setColor(Color.red); 
     for(int i=0;i<board.length;i++) { 
      for(int j=0;j<board.length;j++) { 
       if(board[i][j]) 
        g2d.fillRect(9*i+1, 9*j+1, 6, 6); 
      } 
     } 
    } 

    static JScrollPane makeTextArea(TurtleRenderer image) { 
     JTextArea textArea = new JTextArea(); 
     textArea.getDocument().addDocumentListener(image); 
     textArea.setVisible(true); 
     JScrollPane areaScrollPane = new JScrollPane(textArea); 
     areaScrollPane.setVerticalScrollBarPolicy(
       JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
     areaScrollPane.setBorder(BorderFactory.createLineBorder(Color.black)); 
     return areaScrollPane; 
    } 

    @Override 
    public void insertUpdate(DocumentEvent e) { 
     changed(e); 
    } 

    @Override 
    public void removeUpdate(DocumentEvent e) { 
     changed(e); 
    } 

    @Override 
    public void changedUpdate(DocumentEvent e) { 
     changed(e); 
    } 

    void changed(DocumentEvent de) { 
     String description; 
     Document document = de.getDocument(); 
     try { 
      description = document.getText(0, document.getLength()); 
     } catch (BadLocationException e) { 
      throw new RuntimeException(e); 
     } 
     try { 
      board = boardMaker.makeBoardFrom(description); 
     } catch(ParserException pe) { 
      board = null; 
     } 
     this.repaint(); 
    } 
} 
+0

你能澄清你上面的问题的文字吗?也许这只是我,但你对你的问题的解释对我来说非常令人困惑。 – 2013-03-09 18:42:04

+1

Next:为什么要将AWT组件(如'Panel')与Swing组件(比如其他所有组件)混合?为什么不使用Swing组件? – 2013-03-09 18:43:14

+0

我认为解析字符串时存在问题。 – 2013-03-09 18:46:52

回答

1

你的问题是,你目前正在测试,如果通过的JTextArea举行整个文本持有 “小时”。如果hr是JTextArea中唯一的文本,这可能是正确的,但再次添加文本时,这将始终是错误的。你需要检查的是最后一行是“hr”。

由于这是家庭作业,我不会发布一个解决方案,但你的DocumentListener伪代码逻辑的解决办法是:

try 
    get the text String from the document 
    get the last char from this String 
    if this last Char == carriage return which is (char)10 
     split the text into lines using the carriage return as the split's delimiter 
     get the last line held by this array and check it 
     if it is hr do something 
    end if last char == carriage return 
end try 
catch for BadLocationException 
0

从的Javadoc,

public boolean contentEquals(CharSequence cs) 

Compares this string to the specified CharSequence. 
The result is true if and only if this String represents the same sequence of char values as the specified sequence. 

public boolean contains(CharSequence s) 

Returns true if and only if this string contains the specified sequence of char values. 

因此String.contentEquals将起作用更多类型的String.equals方法。 There are some differences though

至于这个问题,你将需要String.contains方法检查的文本是否包含String "hr"


一个更多的建议与问候代码效率:

您没有执行任何操作在DocumentListener内的changedUpdate(DocumentEvent e)方法中。只有当一个属性或一组属性发生变化时,才会调用此方法,即文档样式已更改,这在JTextArea中不可行,因为它不支持样式文本。

我希望我能正确理解你的问题。

0

首先,如在previous comment中,方法makeBoardFrom将每次收到 整个程序。如果由您决定将该程序拆分为单个命令,然后执行每个命令。你不应该试图改变TurtleRenderer类的行为不同。第二,如果你想将乌龟向左移两格,你必须将 方格标记为已访问,而不仅仅是目标方格。现在,在您的解决方案中,仅使用previousX+=2;,您只能将目标广场标记为已访问。

第三,在initialBoard方法中,你还必须用true实际标记龟的起始平方。在你的情况下,这将是位置(0,0)的平方。

相关问题