Java JTextArea赢得';除非我对其调用append(),否则不会显示

Java JTextArea赢得';除非我对其调用append(),否则不会显示,java,eclipse,swing,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));

下面的问题使我感到困惑,所以我来这里寻求帮助

经过实验,我最终得到了以下代码块:

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.");
聊天面板在scrollPanel中显示良好,文本为“derpHello.”。根据发生的事情有什么想法吗

对于记录,pane是一个简单的容器,具有空布局,否则会显示eveyrthing fine。声明,仅供记录:


当您使用空字符串初始化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();
}

}

我对以下代码没有问题,我可以看到绿色的“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()
并拥有更简单、更易于维护的代码


您的代码目前还没有说明某些其他内容。尝试放置一个。

不要使用空布局。尝试在您添加的容器上调用
invalidate
repaint
。是我遗漏了什么,还是您正在用emtpy字符串绘制您的
JTextArea
?@GuillaumePolet感谢您注意到这一点,这是一个错误。我正在用“derp”初始化TextArea,而不是“”。修复了。@尼古拉·库兹涅佐夫添加scrollPanel.revalidate()或scrollPanel.invalidate()或scrollPanel.repaint()或以上任何组合都不能满足好奇心,为什么要使用
setOpaque(false)
?你真的打算这样做,把沉重的负担摆在秋千上,还是真的有原因?你真的知道这是干什么的吗?你试过使用这个构造函数吗?具体在哪个线程上启动Swing应用程序?请参见上文,以及之后的编辑。这是一个错误,我用一个新的JTextArea(“derp”)调用初始化了JTextArea。因此,当聊天面板出现时,为什么追加后的驱动文本是“derpHello”。啊!你能看看吗。Timmos,你的部分回答回答了我的问题。我没有在scrollPanel中设置聊天面板的大小。好吧,伙计,我能说的是它确实显示在这里。无论如何,我的答案是正确的,因为在你编辑代码来纠正错误之前,你的代码是正确的。你投我一票,谢谢。编辑:确定下一票消失:)@dimitrissfouns您不应该在任何组件上设置大小/边界/位置,这是LayoutManager的责任。JScrollPane和JViewPort都有自己的LayoutManager,可以适当地设置边界。@Timmos您不能。另外,低于125分的用户无论如何都不能投否决票。这让人感到不安,纪尧姆。我不认为我在这个例子中遗漏了代码中的任何重要部分,但是我无法在setBounds()之前添加(“东西”)或在scrollPanel的constructor中使用之前在chatPanel上执行setSize(x,y)之前看到绿色的“derp”。我会继续调查。@Dimitrissfouns您是否也看到了上述代码的问题?不幸的是,没有。您的代码(以及我主要问题中的扩展代码)运行良好。我认为这是JTextArea和我在本地使用的东西之间的问题,但它可能完全是另一个问题。很抱歉使用空布局,但在我的项目中,我决定使用绝对定位而不是布局。我以后可能会改变。这可能是因为我没有通过invokeLater()运行它,或者setVisible(true)的位置错误;被认为是信息量最大、最有帮助的。我的问题一开始就不正确,因为它没有显示出问题。
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();
            }
        });
    }

}