0

我使用 lanterna 创建了一个简单的终端应用程序,它只显示一个自定义按钮。但是,即使在自定义按钮的类中,我扩展了 Button 类并覆盖了 Button 类的 createDefaultRenderer 方法以返回 Button 类的 FlatButtonRenderer 类的实例,它仍然使用 DefaultButtonRenderer 类来显示按钮。

你能帮我理解如何在 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("."));
                        }
                }

        }

}
4

1 回答 1

0

我相信使用 FlatButtonRenderer 的正确方法是调用 setRenderer()。

private class XButton extends Button {
    public XButton(String label) { 
        super(label); 
        setRenderer(new Button.FlatButtonRenderer()); 
    } 
}
于 2018-01-17T03:48:58.750 回答