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.");

聊天面板在滚动面板中显示良好,其文本为“derpHello.”。关于发生了什么的任何想法?

作为记录,窗格是一个简单的容器,具有空布局,否则显示一切正常。声明,仅作记录:

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 回答