在没有 \t 的情况下,如何在 JTextArea 中均匀 space 输出二维数组?
How can I evenly space out 2d array in JTextArea without \t?
我 运行 今天在编码时遇到了一个小问题。我不是 java 方面的专家,我才刚刚开始学习 GUI,所以请多多包涵。
我正在创建一个涉及由这个二维数组组成的地图的游戏,我创建了一个方法来将该二维数组放入文本区域。
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" );
}
}
如果你注意到我用来 space 每个元素的“\t”。这对于均匀间隔它很有效,但是 space 非常大。我的数组结果是这样的:
x H f f x x
x f x f D x
x x x x x x
这种间距很好,因为不同的字母不会抵消其他字母的位置,但对于我的目的来说它太大了,但如果我简单地用几个 space 代替“\t”我得到的东西不像我使用 /t 时那样排列,而是不同大小的字母会抛出该行的其余部分。
所以我想知道是否有人可以帮我想出一个解决方案,以便在打印出来时均匀 space 这些字母。如果有任何反馈和帮助,我将不胜感激。
谢谢。
如果您想使用 JTextField,它有方法 JTextArea#setTabSize(int),您可以使用该方法减少制表符宽度。
编辑:JTextArea 似乎不对齐制表符,因此您需要使用等宽字体。
文本组件并不是为以这种方式格式化数据而设计的(至少不是为显示纯文本而设计的组件)。
您可以改用 JTable
,例如...
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 中...
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);
并且...如果您 "really" 想要使用文本组件,那么像 JEditorPane
这样的东西可能是更好的选择,因为您不需要担心等宽字体...
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));
我 运行 今天在编码时遇到了一个小问题。我不是 java 方面的专家,我才刚刚开始学习 GUI,所以请多多包涵。
我正在创建一个涉及由这个二维数组组成的地图的游戏,我创建了一个方法来将该二维数组放入文本区域。
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" );
}
}
如果你注意到我用来 space 每个元素的“\t”。这对于均匀间隔它很有效,但是 space 非常大。我的数组结果是这样的:
x H f f x x
x f x f D x
x x x x x x
这种间距很好,因为不同的字母不会抵消其他字母的位置,但对于我的目的来说它太大了,但如果我简单地用几个 space 代替“\t”我得到的东西不像我使用 /t 时那样排列,而是不同大小的字母会抛出该行的其余部分。
所以我想知道是否有人可以帮我想出一个解决方案,以便在打印出来时均匀 space 这些字母。如果有任何反馈和帮助,我将不胜感激。
谢谢。
如果您想使用 JTextField,它有方法 JTextArea#setTabSize(int),您可以使用该方法减少制表符宽度。
编辑:JTextArea 似乎不对齐制表符,因此您需要使用等宽字体。
文本组件并不是为以这种方式格式化数据而设计的(至少不是为显示纯文本而设计的组件)。
您可以改用 JTable
,例如...
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 中...
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);
并且...如果您 "really" 想要使用文本组件,那么像 JEditorPane
这样的东西可能是更好的选择,因为您不需要担心等宽字体...
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));