有没有一种方法可以在应用程序启动时以编程方式设置特定的终端字体?

时间:2018-08-03 17:06:19

标签: java linux terminal game-development

我正在开发一个用Java编写的基于文本的冒险游戏,想知道是否有一种方法可以强制使用某种终端字体,以确保某些字符以一致的方式间隔以“绘制”事物例如关卡地图和UI元素。

从SO上的一些研究中,我看到System.out无法使用指定的字体,它实际上取决于最终用户的控制台/终端字体设置。

我已经实现了一个bash脚本,以在启动过程中获取用户终端当前调整大小的行数,并将这些值写入到我的Java代码随后读取的文件中。

有没有一种方法可以通过Java或游戏启动脚本在游戏加载之前让最终用户的终端使用某种字体?有没有人用自己的基于文本的游戏来处理此类问题?最好只是告知最终用户,最好使用某种字体(等距,无衬线字体)以获得最佳游戏体验?

1 个答案:

答案 0 :(得分:0)

实际上这很容易。您应该做的是使用JTextPane或JTextArea创建自己的控制台窗口,然后将打印流重定向到该窗口。这是一个示例:

import javax.swing.*;
import java.awt.*;
import java.io.OutputStream;
import java.io.PrintStream;

class Example {
    public static void main(String[] args) {

        ConsoleWindow printWindow = new ConsoleWindow().fixPosition();
        PrintStream stream = new PrintStream(new CustomOutputStream(printWindow.jTextArea));
        System.setOut(stream);
        System.setErr(stream);


        System.out.println("This is a custom console window.");
    }
}

class CustomOutputStream extends OutputStream {
    private JTextArea textArea;

    CustomOutputStream(JTextArea textArea) {
        this.textArea = textArea;
    }

    @Override
    public void write(int b) {
        textArea.append(String.valueOf((char) b));
        textArea.setCaretPosition(textArea.getDocument().getLength());
    }
}

class ConsoleWindow {
    private JFrame frame = new JFrame();
    private JPanel panel = new JPanel();
    JTextArea jTextArea = new JTextArea();
    private JScrollPane jScrollPane = new JScrollPane(jTextArea);

    ConsoleWindow() {
        new Thread(() -> {
            setupFrame();
            setupPanels();
            setupTextArea();
            setupScrolling();
            makeVisible();
        }).start();
    }

    private void setupFrame() {
        frame.setSize(854, 480);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setContentPane(panel);
        frame.setLayout(null);
    }

    private void setupPanels() {
        panel.setSize(panel.getParent().getSize());
        panel.setLayout(new GridLayout());
        panel.add(jScrollPane);
    }

    private void setupTextArea() {
        jTextArea.setFont(new Font("Ariel", Font.PLAIN, 20)); // TERMINAL FONT
        jTextArea.setBackground(Color.BLACK); // TERMINAL COLOR
        jTextArea.setForeground(Color.GREEN); // TEXT COLOR
    }

    private void setupScrolling() {
    }

    private void makeVisible() {
        frame.setVisible(true);
    }

    ConsoleWindow fixPosition() {
        jScrollPane.getHorizontalScrollBar().setValue(0);
        jScrollPane.getVerticalScrollBar().setValue(0);
        return this;
    }
}