除非我在其上调用append(),否则JTextArea不会显示

时间:2013-01-03 12:59:22

标签: java eclipse swing

以下问题令我难以置信,所以我来到这里寻求帮助。

经过实验,我最终得到了这段代码:

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。”。根据发生的事情有什么想法吗?

对于记录,窗格是一个具有空布局的简单容器,否则显示传送正常。声明,仅供记录:

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

2 个答案:

答案 0 :(得分: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而不是null布局。这样您就可以使用pack()revalidate(),并且可以使用更简单,更易于维护的代码。

您的代码现在必须有其他内容。尝试添加SSCCE

答案 1 :(得分:0)

在使用空String初始化时,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();
}

}