如何在没有\ t的情况下在JTextArea中均匀分隔出2d数组?

时间:2015-02-11 00:08:58

标签: java matrix formatting jtextarea

我在编码时遇到了一个小问题。我不是java的专家,我只是刚开始学习GUI,所以请耐心等待。

我正在创建一个涉及由这个2D数组组成的地图的游戏,我创建了一个将2D数组放在textArea中的方法。

public void viewMap(String[][] matrix)
{
    for (int r = 0; r < matrix.length; r++) {
        for (int c = 0; c < matrix[0].length; c++)
        {
            textArea.setText(textArea.getText() + "\t" + String.valueOf(matrix[r][c]));
        }
        textArea.setText(textArea.getText() + "\n" );
    }
}

如果你注意到我用来隔开每个元素的“\ t”。这适用于均匀间隔它,但空间非常大。我的阵列结果是这样的:

x              H              f              f              x              x
x              f              x              f              D              x
x              x              x              x              x              x

这种间距很大,因为不同的字母不会偏移其他字母的位置,但是对于我的目的而言它是大的方式,但如果我只是用几个空格代替“\ t”我得到当我使用/ t时不会像它那样排列的东西,而是不同大小的字母抛出了行的其余部分。

所以我想知道是否有人可以帮我提出一个解决方案,以便在打印出来时均匀地分隔这些字母。我真的很感激任何反馈和帮助。

感谢。

2 个答案:

答案 0 :(得分:1)

文本组件并非设计用于以这种方式格式化数据(至少不是用于显示纯文本的组件)。

您可以使用JTable代替,例如......

enter image description here

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;

public class Test {

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

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new BorderLayout());
            String[][] matrix = new String[][]{
                {"x", "H", "f", "f", "x", "x"},
                {"x", "f", "x", "f", "D", "x"},
                {"x", "H", "f", "f", "x", "x"},
            };

            DefaultTableModel model = new DefaultTableModel(0, 6);
            for (String[] row : matrix) {
                model.addRow(row);
            }

            JTable table = new JTable(model) {
                @Override
                protected void configureEnclosingScrollPane() {
                }
            };
            table.setShowGrid(false);
            table.setIntercellSpacing(new Dimension(0, 0));

            add(new JScrollPane(table));

        }

    }

}

如果您不需要编辑值或需要任何真正想要的东西(例如选择),您可以使用JLabel并将文本包装在HTML TABLE中...

enter image description here

setLayout(new GridBagLayout());
String[][] matrix = new String[][]{
    {"x", "H", "f", "f", "x", "x"},
    {"x", "f", "x", "f", "D", "x"},
    {"x", "H", "f", "f", "x", "x"},
};

JLabel label = new JLabel();
StringBuilder sb = new StringBuilder("<html>");
sb.append("<table boder=0>");
for (String[] row : matrix) {
    sb.append("<tr>");
    for (String col : row) {
        sb.append("<td align=center>").append(col).append("</td>");
    }
    sb.append("</tr>");
}
sb.append("</table>");
label.setText(sb.toString());
add(label);

而且......如果你真的&#34;想要使用文本组件,那么JEditorPane之类的东西可能是更好的选择,因为您不必担心单倍间距字体...

enter image description here

setLayout(new BorderLayout());
String[][] matrix = new String[][]{
    {"x", "H", "f", "f", "x", "x"},
    {"x", "f", "x", "f", "D", "x"},
    {"x", "H", "f", "f", "x", "x"},};

JLabel label = new JLabel();
StringBuilder sb = new StringBuilder("<html><body>");
sb.append("<table boder=0>");
for (String[] row : matrix) {
    sb.append("<tr>");
    for (String col : row) {
        sb.append("<td align=center>").append(col).append("</td>");
    }
    sb.append("</tr>");
}
sb.append("</table></body></html>");
JEditorPane ep = new JEditorPane();
ep.setContentType("text/html");
ep.setText(sb.toString());
add(new JScrollPane(ep));

答案 1 :(得分:0)

如果你想使用JTextField,它有方法JTextArea#setTabSize(int),你可以用它来减少标签宽度。

编辑:JTextArea似乎没有对齐标签,因此您需要使用等宽字体。