Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用swing布局创建一个简单的控制台_Java_Swing - Fatal编程技术网

Java 使用swing布局创建一个简单的控制台

Java 使用swing布局创建一个简单的控制台,java,swing,Java,Swing,我正试图实现一个简单的带有swing布局的“控制台”,我将能够以不同的行和不同的颜色向每个控制台添加简单的消息 我已经能够做一些事情,但我仍然有问题 我已经试过两次了 1:使用网格布局: 这实际上效果很好。但我现在面临的问题是,如果我没有足够的信息,它们之间就会存在巨大的差距。我确实尝试设置hgap和vgap,但它们在这件事上没有影响 2:尝试使用流布局。但由于某种原因,这种糟糕的布局似乎只能在垂直方向上工作,而不能在水平方向上工作。所以,除非我能改变它的布局,否则这是不好的。你可以用一个单独的

我正试图实现一个简单的带有swing布局的“控制台”,我将能够以不同的行和不同的颜色向每个控制台添加简单的消息

我已经能够做一些事情,但我仍然有问题

我已经试过两次了

1:使用网格布局:

这实际上效果很好。但我现在面临的问题是,如果我没有足够的信息,它们之间就会存在巨大的差距。我确实尝试设置hgap和vgap,但它们在这件事上没有影响


2:尝试使用流布局。但由于某种原因,这种糟糕的布局似乎只能在垂直方向上工作,而不能在水平方向上工作。所以,除非我能改变它的布局,否则这是不好的。你可以用一个单独的JEditorPane来显示整个东西

下面是一个非常简单的例子:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.util.Date;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;

public class TestConsole {

    private static final String TEXT = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec purus sapien, molestie dapibus feugiat vitae, pharetra lobortis lacus. Proin metus neque, malesuada vel consectetur vel, imperdiet et mauris. Vivamus vel tortor ipsum, ac semper ipsum. Nam semper tellus et purus molestie vestibulum. Aliquam erat volutpat. Nam vulputate facilisis magna id sollicitudin. Donec rutrum lorem sit amet orci lacinia congue. Ut nec nibh ipsum, et ornare tellus. Etiam nisi massa, mollis eu viverra id, luctus sed massa. Donec tincidunt erat vel sapien varius ultricies. Vivamus dui diam, consequat nec facilisis ut, interdum at enim. Vestibulum vestibulum, lorem nec cursus eleifend, purus orci egestas quam, vel sodales sem magna at nibh. Cras id nibh eleifend turpis sollicitudin adipiscing. Nunc aliquet posuere vulputate. Suspendisse id augue ut quam mattis sollicitudin. ";

    private static final int ROWS = 24;
    private static final int COLUMNS = 80;

    private JEditorPane console;

    public void append(final String s, final Color color) {
        if (!SwingUtilities.isEventDispatchThread()) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    append(s, color);
                }
            });
            return;
        }
        Document document = console.getDocument();
        MutableAttributeSet sas = new SimpleAttributeSet();
        StyleConstants.setForeground(sas, color);
        try {
            document.insertString(document.getLength(), s, sas);
        } catch (BadLocationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    private void initUI() {
        JFrame frame = new JFrame(TestConsole.class.getSimpleName());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        console = new JEditorPane() {
            @Override
            public Dimension getPreferredSize() {
                Dimension d = super.getPreferredSize();
                FontMetrics fm = getFontMetrics(getFont());
                int colWidth = fm.charWidth('m');
                int rowHeight = fm.getHeight();
                d.width = Math.max(d.width, rowHeight * ROWS);
                d.height = Math.max(d.height, colWidth * COLUMNS);
                return d;
            }
        };
        console.setEditable(false);
        console.setContentType("text/html");
        console.setForeground(Color.WHITE);
        console.setBackground(Color.BLACK);
        console.setFont(new Font("Consolas", Font.PLAIN, 14));
        frame.add(new JScrollPane(console));
        frame.pack();
        frame.setVisible(true);
        Timer t = new Timer();
        t.scheduleAtFixedRate(new TimerTask() {
            Random random = new Random();

            @Override
            public void run() {
                int start = random.nextInt(TEXT.length());
                int size = random.nextInt(TEXT.length() - start);
                append(TEXT.substring(start, start + size) + "\n", new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)));
            }
        }, new Date(), 1000);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TestConsole().initUI();
            }
        });
    }

}

你看过使用JTextPane吗?每个createerrormessage返回jtextpaneTry。这可能也适用于你的情况,它使用
JTextPane
…但我认为它不允许使用不同颜色的文本?@Ash my bad,我在OP的问题中错过了这一点。我将更新我的帖子,我认为JTextPane是一个不错的选择,但是如果没有JTextArea提供的方便的“附加”,你就必须使用底层文档了?谢谢。这个答案和gagandeep bali的评论都是很好的解决方案。@Gleeb:非常欢迎你,保持微笑:-),GuillaumePolet的答案总是值得关注和理解的,它们总是包含一些有价值的信息。
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.util.Date;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;

public class TestConsole {

    private static final String TEXT = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec purus sapien, molestie dapibus feugiat vitae, pharetra lobortis lacus. Proin metus neque, malesuada vel consectetur vel, imperdiet et mauris. Vivamus vel tortor ipsum, ac semper ipsum. Nam semper tellus et purus molestie vestibulum. Aliquam erat volutpat. Nam vulputate facilisis magna id sollicitudin. Donec rutrum lorem sit amet orci lacinia congue. Ut nec nibh ipsum, et ornare tellus. Etiam nisi massa, mollis eu viverra id, luctus sed massa. Donec tincidunt erat vel sapien varius ultricies. Vivamus dui diam, consequat nec facilisis ut, interdum at enim. Vestibulum vestibulum, lorem nec cursus eleifend, purus orci egestas quam, vel sodales sem magna at nibh. Cras id nibh eleifend turpis sollicitudin adipiscing. Nunc aliquet posuere vulputate. Suspendisse id augue ut quam mattis sollicitudin. ";

    private static final int ROWS = 24;
    private static final int COLUMNS = 80;

    private JEditorPane console;

    public void append(final String s, final Color color) {
        if (!SwingUtilities.isEventDispatchThread()) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    append(s, color);
                }
            });
            return;
        }
        Document document = console.getDocument();
        MutableAttributeSet sas = new SimpleAttributeSet();
        StyleConstants.setForeground(sas, color);
        try {
            document.insertString(document.getLength(), s, sas);
        } catch (BadLocationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    private void initUI() {
        JFrame frame = new JFrame(TestConsole.class.getSimpleName());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        console = new JEditorPane() {
            @Override
            public Dimension getPreferredSize() {
                Dimension d = super.getPreferredSize();
                FontMetrics fm = getFontMetrics(getFont());
                int colWidth = fm.charWidth('m');
                int rowHeight = fm.getHeight();
                d.width = Math.max(d.width, rowHeight * ROWS);
                d.height = Math.max(d.height, colWidth * COLUMNS);
                return d;
            }
        };
        console.setEditable(false);
        console.setContentType("text/html");
        console.setForeground(Color.WHITE);
        console.setBackground(Color.BLACK);
        console.setFont(new Font("Consolas", Font.PLAIN, 14));
        frame.add(new JScrollPane(console));
        frame.pack();
        frame.setVisible(true);
        Timer t = new Timer();
        t.scheduleAtFixedRate(new TimerTask() {
            Random random = new Random();

            @Override
            public void run() {
                int start = random.nextInt(TEXT.length());
                int size = random.nextInt(TEXT.length() - start);
                append(TEXT.substring(start, start + size) + "\n", new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)));
            }
        }, new Date(), 1000);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TestConsole().initUI();
            }
        });
    }

}