1

このコードを以前に投稿したところ、多くの役立つ回答が得られましたが、大部分はコードを完全に変更する必要があるというものでした。私はそれを理解しています、そして私は明日やります!しかし、今のところ、なぜこれがうまくいかないのか、これは私を悩ませています。

ChatBox クラスから MessageWindow クラスに sendText を取得して、messagePane に出力しようとしています。それでおしまい。とてもシンプルに思えますが、おそらくそうです...しかし、私は文字通り10時間連続でこれに取り組んできました. コードを完全に変更せずに、ChatBox に入れたものを MessageWindow に出力したいだけです。助けてください :(

public class ChatBox extends JPanel {

private JScrollPane scrollPane;
private String sendText;

public ChatBox() {
    final JTextArea chatPane = new JTextArea();

    scrollPane = new JScrollPane(chatPane,
            JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
            JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    add(scrollPane);
    scrollPane.setMinimumSize(new Dimension(550, 50));
    scrollPane.setPreferredSize(new Dimension(550, 50));

    chatPane.addKeyListener(new KeyListener() {

        @Override
        public void keyPressed(KeyEvent e) {
        }

        @Override
        public void keyReleased(KeyEvent e) {
            if( e.getKeyCode() == KeyEvent.VK_ENTER ) {
                sendText = chatPane.getText();
                setText(sendText);
                chatPane.setText(null);
                // System.out.println(sendText); // I can see this in console
            }

        }

        @Override
        public void keyTyped(KeyEvent e) {
        }

    });

}


public String getText() {
    return sendText;
}


public void setText(String sendText) {
    this.sendText = sendText;
}

}

私の頭の中で、私はsendTextを設定しています->私が入力したものは何でも。次に、MessageWindow クラスで、getter を使用してテキストを取得し、messagePane に出力しようとしています。

public class MessageWindow extends JPanel {

private ChatBox box = new ChatBox();

public MessageWindow() {
    JTextArea messagePane = new JTextArea();

    setLayout(new GridBagLayout());

    GridBagConstraints gc = new GridBagConstraints();

    gc.weightx = 1;
    gc.weighty = 1;
    gc.fill = GridBagConstraints.BOTH;
    gc.insets = new Insets(5, 5, 5, 5);
    add(new JScrollPane(messagePane), gc);

    System.out.println(box.getText());   // Getting null in the console.
    messagePane.append(box.getText());   // Not getting anything on messagePane.

}

}

JTextArea の代わりに、ActionListeners と JTextField を使用する必要があることはわかっています。そして、明日から始めることを約束します。このプログラム全体をそのまま破棄します。なぜこの基本的なことがうまくいかないのかを知る必要があるだけです:(Javaを学んでいるときに、ゲッター/セッターが完全に理解するのに問題になることを知っていました。それについては正しいです笑...

助けてくれてありがとう!!!

新しいコード

public class MessageWindow extends JPanel {

private ChatBox box = new ChatBox(this);

public void OnTextSet(String s) {
    System.out.println(s);
}

public MessageWindow() {
    JTextArea messagePane = new JTextArea();

    setLayout(new GridBagLayout());

    GridBagConstraints gc = new GridBagConstraints();

    gc.weightx = 1;
    gc.weighty = 1;
    gc.fill = GridBagConstraints.BOTH;
    gc.insets = new Insets(5, 5, 5, 5);
    add(new JScrollPane(messagePane), gc);

    System.out.println(box.getText()); // Getting null in the console.
    messagePane.append(box.getText()); // Not getting anything on
                                        // messagePane.

}

}

public class ChatBox extends JPanel {

private JScrollPane scrollPane;
private String sendText = "";
private MessageWindow mw;

public ChatBox() {
    final JTextArea chatPane = new JTextArea();

    scrollPane = new JScrollPane(chatPane,
            JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
            JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    add(scrollPane);
    scrollPane.setMinimumSize(new Dimension(550, 50));
    scrollPane.setPreferredSize(new Dimension(550, 50));

    chatPane.addKeyListener(new KeyListener() {

        @Override
        public void keyPressed(KeyEvent e) {
        }

        @Override
        public void keyReleased(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                sendText = chatPane.getText();
                setText(sendText);
                chatPane.setText(null);
                mw.OnTextSet(sendText);
                // System.out.println(sendText); // I can see this in
                // console
            }

        }

        @Override
        public void keyTyped(KeyEvent e) {
        }

    });

}

public ChatBox(MessageWindow mw) {
    this.mw = mw;
}


public String getText() {
    return sendText;
}

public void setText(String sendText) {
    this.sendText = sendText;
}

}

4

2 に答える 2

0

メッセージをやり取りするには、からChatboxへのリンクが必要です。MessageWindow

できることは、以下のように変更することです

private ChatBox box = new ChatBox(this); //is this legal in java?
                                  ^^^^
public void OnTextSet(String s){
    System.out.println(s);      
}

//elsewhere
private MessageWindow mw;
public ChatBox(MessageWindow mw) {
               ^^^^^^^^^^^^^^^^
   this.mw = mw

...
public void keyReleased(KeyEvent e) {
...
   mw.OnTextSet(sendText);
}

ここで何かを入力すると、印刷物が表示されるはずです

于 2013-08-26T03:03:18.547 に答える
0

ChatBox クラスの変数sendTextは、作成時に初期化されません。keyReleasedイベントはまだ発生していないため、sendTextNULL のままです。チャットボックスでコードから変更してみてください

から:

private String sendText;

に:

private String sendText = "";
于 2013-08-26T03:11:55.560 に答える