1

次の問題で頭がおかしくなったので、助けを求めてここに来ました。

実験した後、私はこのコードのブロックに行き着きました:

JTextArea chatPanel = null;
JScrollPane scrollPanel = null;

if(chatPanel == null)
{
    chatPanel = new JTextArea("derp");
    chatPanel.setEditable(false);
    chatPanel.setForeground(new Color(10,191,26));
    chatPanel.setOpaque(false);
    scrollPanel = new JScrollPane(chatPanel);
    scrollPanel.setOpaque(false);
    scrollPanel.getViewport().setOpaque(false);
    scrollPanel.setBorder(BorderFactory.createEmptyBorder());
}

//## marked area ##         
scrollPanel.setBounds(9,596,435,138);
pane.add(scrollPanel);              

結果?何も表示されません。「derp」が含まれているテキスト領域はありません。空のスクロールパネルだけです。ここで、##マークされた領域##に移動し、次のように置き換えます。

chatPanel.append("Hello.");

chatPanelはscrollPanelに正常に表示され、そのテキストは「derpHello」です。何が起こっているのかによるアイデアはありますか?

記録のために、ペインはnullレイアウトの単純なコンテナであり、それ以外の場合はすべてが正常に表示されます。記録のための宣言:

Container pane = getContentPane()
pane.setLayout(null);
4

2 に答える 2

2

次のコードに問題はありません。緑色の「derp」が問題なく表示されます。

import java.awt.Color;
import java.awt.Container;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

public class TestTextArea {

    private void initUI() {
        JFrame frame = new JFrame("test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JTextArea chatPanel = null;
        JScrollPane scrollPanel = null;
        Container pane = frame.getContentPane();
        pane.setLayout(null);
        if (chatPanel == null) {
            chatPanel = new JTextArea("derp");
            chatPanel.setEditable(false);
            chatPanel.setForeground(new Color(10, 191, 26));
            chatPanel.setOpaque(false);
            scrollPanel = new JScrollPane(chatPanel);
            scrollPanel.setOpaque(false);
            scrollPanel.getViewport().setOpaque(false);
            scrollPanel.setBorder(BorderFactory.createEmptyBorder());
        }

        // ## marked area ##
        scrollPanel.setBounds(9, 596, 435, 138);
        pane.add(scrollPanel);
        frame.validate();
        frame.setSize(600, 800);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TestTextArea().initUI();
            }
        });
    }

}

LayoutManagerさて、私はあなたにそのヌルレイアウトの代わりに適切なものを使うことを本当にお勧めします。それはあなたが使用することを可能にしpack()revalidate()そしてはるかに単純でより保守しやすいコードを持つでしょう。

あなたのコードが今のところ説明していない何かが他にあるに違いありません。SSCCEを入れてみてください。

于 2013-01-03T13:24:24.450 に答える
0

空の文字列で初期化するときに表示するJTextAreaには何もありません。あなたがそれに何かを加えるとき、中に事実上テキストがあります。

JScrollPaneが内部のコンポーネントのサイズを変更しようとしないことに注意してください(他にスクロールできるのはなぜですか?)。したがって、JTextAreaにディメンションを設定する必要があります。

編集(コード修正後):次のコードで「derp」がうまく表示されます。

public class TextTest extends JFrame {
public TextTest () {
    JPanel pane = new JPanel();
    JTextArea chatPanel = null;
    JScrollPane scrollPanel = null;

    if(chatPanel == null)
    {
        chatPanel = new JTextArea("derp");
        chatPanel.setEditable(false);
        chatPanel.setForeground(new Color(10,191,26));
        chatPanel.setOpaque(false);
        scrollPanel = new JScrollPane(chatPanel);
        scrollPanel.setOpaque(false);
        scrollPanel.getViewport().setOpaque(false);
        scrollPanel.setBorder(BorderFactory.createEmptyBorder());
    }

    //## marked area ##         
    scrollPanel.setBounds(9,596,435,138);
    pane.add(scrollPanel);
    setContentPane(pane);
    setVisible(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
}

public static void main(String[] args) {
    new TextTest();
}

}
于 2013-01-03T13:16:39.460 に答える