JavaFX: как уменьшить полноэкранный режим окна другого приложения

Я стремлюсь создать приложение JavaFX, работающее как виджет (всегда наверху), но также уменьшающее доступное пространство для других внешних приложений.

Вы можете видеть это как новую панель инструментов Windows: если я открою свой браузер в полноэкранном режиме, я бы хотел, чтобы моя «панель инструментов» была видна рядом с браузером, всегда была видна, но без перекрытия.

Эта панель инструментов займет всю высоту экрана и будет приклеена к левой или правой части экрана.

1) Возможно ли это с JavaFX? (Или с некоторой интеграцией Swing в JavaFX)

2) Как я мог это сделать? Или где я могу найти документацию? (Одна из трудностей заключается в том, что я не могу найти ключевое слово для того, что я хочу сделать, возможно, из-за отсутствия у меня английского словарного запаса)

3) Совместимо ли это? (Windows, MacOS, Linux...)

4) Есть ли другое приложение, которое может реализовать этот трюк? (Некоторые говорили мне, что VLC может это сделать, но я не нашел этот параметр)

Если я неясен в своем описании, я отредактирую неясные части :)


person sybb    schedule 10.03.2015    source источник
comment
Я собираюсь пойти с «невозможно» или «очень, очень продвинуто». Главным образом потому, что изменение размера приложения выполняется в самом приложении, а не, скажем, в ОС Windows. Я могу ошибаться в этом, но вам, по сути, придется взломать приложение, чтобы принудительно изменить его размер из другой программы.   -  person Philip Vaughn    schedule 11.03.2015
comment
тебе это еще нужно? , я только что нашел способ   -  person Elltz    schedule 29.08.2015


Ответы (1)


Сэр;

вы: "Эта панель инструментов займет всю высоту экрана и будет приклеена к левой или правой части экрана"

я: использую класс Screen

вы: "Возможно ли это с JavaFX? (Или с некоторой интеграцией Swing в JavaFX)"

я: да

вы: "Как я могу это сделать? Или где я могу найти документацию? (Одна из трудностей заключается в том, что я не могу найти ключевое слово для того, что я хочу сделать, может быть из-за отсутствия у меня английского словарного запаса)"

я: вот пример кода

//create two stages
Stage toolbar = new Stage(), main = new Stage();
//creating a chunk here to fill up our 'main' 
AnchorPane a = new AnchorPane();
WebView wv = new WebView();
Label l = new Label("Loading url");
wv.getEngine().getLoadWorker().stateProperty().addListener(new ChangeListener<State>() {

    @Override
    public void changed(ObservableValue<? extends State> arg0,
                    State arg1, State arg2) {
        if(arg2.equals(State.RUNNING)){
            l.setText("LOADING");
        }else if(arg2.equals(State.SUCCEEDED)){
            l.setText("DONE");
        }
    }
});
wv.getEngine().load("http://stackoverflow.com/users/3894351/elltz");
a.autosize();
a.getChildren().addAll(wv,l);
Scene scene = new Scene(a,500,500); 
main.setScene(scene);
main.show();

//creating a chunk to fill up 'toolbar'
TreeItem<String> treeItemRoot1 = new TreeItem<> ("StackOverflow Users");
TreeItem<String> nodeItemA = new TreeItem<>("Elites");
TreeItem<String> nodeItemB = new TreeItem<>("Rookies");
treeItemRoot1.getChildren().addAll(nodeItemA, nodeItemB);
nodeItemA.setExpanded(true);
nodeItemB.setExpanded(true);
TreeItem<String> nodeItemA1 = new TreeItem<>("Jon Skeet");
TreeItem<String> nodeItemA2 = new TreeItem<>("jwelsea");
TreeItem<String> nodeItemA3 = new TreeItem<>("James D");
nodeItemA.getChildren().addAll(nodeItemA1, nodeItemA2, nodeItemA3);
TreeItem<String> nodeItemB1 = new TreeItem<>("Elltz");
TreeItem<String> nodeItemB2 = new TreeItem<>("Sybb");
nodeItemB.getChildren().addAll(nodeItemB1, nodeItemB2);
TreeView<String> treeView = new TreeView<>(treeItemRoot1);
treeView.setShowRoot(false);
// starting of the toolbar alignments 
toolbar.initModality(Modality.NONE); // with this function, i dont quite recall but all 
//you can say is Modality.NONE, means do not override focus from another window
toolbar.setScene(new Scene(treeView,120,(Screen.getPrimary().getVisualBounds().getHeight()-20)));
// the getPrimary gets the default screen or monitor to your system
//so in short i get the height of it then - n; depends on how your screen & margins kinda stuff
toolbar.setMaxWidth(125); //to prevent excessive re-sizing; you could change to your likeness
toolbar.setMinWidth(120); //to prevent excessive re-sizing; you could change to your likeness
toolbar.setX((Screen.getPrimary().getVisualBounds().getMaxX()-130));
// this function above positions your scene at the (widith_of_entire_
//screen - the size of the stage which is toolbar - 10); so with this my
// calculations it will be set perfectly at the right side. the 10 has here
// stands for margins or stuff like that. but if you want the left side,
// you just use the line Screen.getPrimary().getVisualBounds().getMinX();
// you do not need to subtract because you start counting from 0 on your left
toolbar.setY((Screen.getPrimary().getVisualBounds().getMinY()));
// this function above positions the stage vertically, it starts counting
// from 0 at the top, if you wanted to position it somewhere at the bottom
// then you do the minus(-) things
toolbar.show();
new Thread(new Runnable() {
    @Override
    public void run() {
        while(true){
            try {
                Thread.sleep(100); //buy little millieseconds
            } catch (InterruptedException e) {}

            Platform.runLater(()->{
                toolbar.toFront();
                //bring your UI on top of everyone
            });
        }

    }
}).start();

НАДЕЮСЬ, это то, что ты хотел...

person Elltz    schedule 10.03.2015
comment
Привет, спасибо за ответ, но это не то, что я хотел. Этот код вполне описывает мой пример с браузером, но: 1) Вы все еще можете развернуть веб-движок, чтобы перекрыть панель инструментов Графический интерфейс ОС, моя первая цель - Windows, может быть, компонент ActiveX? я мало что знаю в этой области - person sybb; 11.03.2015
comment
Все равно не то ^^. Лучшее, чего я добился до сих пор, - это приклеить панель инструментов слева или справа, используя всю высоту экрана. (Похоже на то, что вы сделали). Недостающая часть - это взаимодействие с внешним приложением, например, скажем, Eclipse: если ваша панель инструментов с Elite/Jon Skeet и т. д. находится слева, я хотел бы автоматически изменить размер Eclipse (из приложения JavaFX), чтобы так уменьшите его ширину и сможете увидеть проводник проекта :) Это был просто пример, но я хотел бы сделать это для всех видов внешних приложений. - person sybb; 13.11.2015