2013-03-09 39 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)的平方。

相關問題