如何在 lanterna 中创建自定义按钮?

How do you create a custom button in lanterna?

我使用 lanterna 创建了一个简单的终端应用程序,它只显示一个自定义按钮。但是即使在自定义按钮的 class 中,我扩展了按钮 class 并将按钮 class' createDefaultRenderer 方法覆盖为 return 按钮的实例 class' FlatButtonRenderer class,它使用 DefaultButtonRenderer class.

显示按钮

你能帮我理解如何在 lanterna 中创建一个使用 FlatButtonRenderer 显示按钮的自定义按钮吗?

import java.io.IOException;
import java.util.ArrayList;

import com.googlecode.lanterna.terminal.*;
import com.googlecode.lanterna.screen.*;
import com.googlecode.lanterna.gui2.*;

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

                DefaultTerminalFactory terminalFactory = new DefaultTerminalFactory();
                Screen screen = null;

                try {
                        screen = terminalFactory.createScreen();
                        screen.startScreen();

                        final WindowBasedTextGUI textGUI = new MultiWindowTextGUI(screen);
                        final Window window = new GUIAppWindow();

                        textGUI.addWindowAndWait(window);
                }
                catch (IOException e) {
                        e.printStackTrace();
                }
                finally {
                        if(screen != null) {
                                try {
                                        screen.stopScreen();
                                }
                                catch(IOException e) {
                                        e.printStackTrace();
                                }
                        }
                }
        }

        private static class GUIAppWindow extends BasicWindow {
                GUIAppWindow() {
                        ArrayList<Window.Hint> hints = new ArrayList<>();
                        hints.add(Window.Hint.CENTERED);
                        setHints(hints);

                        Panel mainPanel = new Panel(new LinearLayout(Direction.VERTICAL));

                        XButton b = new XButton(new String("."));
                        b.addListener(new ButtonHandler("data"));
                        mainPanel.addComponent(b);

                        this.setComponent(mainPanel);
                }

                private class XButton extends Button {

                        public XButton(String label) {
                                super(label);
                        }

                        @Override
                        protected ButtonRenderer createDefaultRenderer() {
                                return new Button.FlatButtonRenderer();
                        }
                }

                private class ButtonHandler implements Button.Listener {
                        final String loc;
                        ButtonHandler(String loc) {
                                this.loc = loc;
                        }
                        public void onTriggered(Button button) {
                                button.setLabel(button.getLabel().equals(".") ? "x" : new String("."));
                        }
                }

        }

}

我认为使用 FlatButtonRenderer 的正确方法是调用 setRenderer()。

private class XButton extends Button {
    public XButton(String label) { 
        super(label); 
        setRenderer(new Button.FlatButtonRenderer()); 
    } 
}