1

割り当て番号3は、基本的なコードを追加するだけで、どのように機能するかを理解することから始めました。しかし、私はこの問題から抜け出すことができません。入力テキストが「hr」に等しい場合、カメが毎回2マス右に移動するように、「if」を追加しました。しかし、コードを実行すると、最初の文字だけをチェックするようになります。最初の2文字が「hr」の場合はポイントをマークしますが、そうでない場合は入力を再度チェックすることはありません。たとえば、私が次のように書いた場合:

re
Fd
hr

「hr」が存在していても、ポイントをマークすることはありません。コードの実行後だけでなく、\ nが挿入されるたびに、TurtleRendererが行を読み取るようにするにはどうすればよいですか?

私のコード:

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();
    }
}
4

3 に答える 3

1

問題は、JTextAreaが保持するテキスト全体が「hr」を保持するかどうかを現在テストしていることです。これは、hrがJTextAreaの唯一のテキストである場合に当てはまる可能性がありますが、テキストがさらに追加されると、これは常にfalseになります。最後の行が「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 
于 2013-03-09T19:01:30.193 に答える
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メソッドとして機能します。ただし、いくつかの違いがあります

この問題と同様にString.contains、テキストにテキストが含まれているかどうかを確認するメソッドが必要になりますString "hr"


コード効率に関するもう1つのアドバイス:

changedUpdate(DocumentEvent e)内のメソッドでアクションを実行する必要はありませんDocumentListener。このメソッドは、属性または属性のセットが変更された場合にのみ呼び出されます。つまり、ドキュメントのスタイルが変更された場合にのみ呼び出されJTextAreaます。これは、スタイル付きテキストをサポートしていないため、では不可能です。

私はあなたの問題を正しく理解したと思います。

于 2013-03-09T19:17:17.207 に答える
0

まず、前のコメントのように、メソッドmakeBoardFromは毎回プログラム全体を受け取ります。そのプログラムを個々のコマンドに分割し、各コマンドを実行するのはあなた次第です。TurtleRendererクラスを別の動作に変更しようとしないでください。

次に、カメを2マス左に移動したい場合は、目的のマスだけでなく、両方のマスを訪問済みとしてマークする必要があります。現在、ソリューションでは、使用previousX+=2;するだけで、目的の正方形に訪問済みのマークを付けるだけです。

第三に、このinitialBoard方法では、実際にカメの最初の正方形を。でマークする必要がありますtrue。あなたの場合、それは位置(0、0)の正方形になります。

于 2013-03-09T22:49:19.790 に答える