Как можно оптимизировать следующий код?

222
17 ноября 2017, 06:16
SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        /*если окно уже создано и не закрыто, то выводим на передний план*/
        if((nf != null) && !nf.isClosed()){
            theDesctop.add(nf, 0);
            try {
                nf.setSelected(true);
            } catch (PropertyVetoException e1)
                {e1.printStackTrace();}
        }else{
            xLocation += 26;
            yLocation += 26;
            if(xLocation > 78 && yLocation > 78){
                xLocation = 26;
                yLocation = 26;
            }
            //nf = new NodeFrame("СМС: Узлы", 20, 30, 405, 500);
            nf = new NodeFrame("СМС: Узлы", xLocation, yLocation, 405, 500);
            theDesctop.add(nf, 0);
            nf.setVisible(true);
        }
    }
});  

Собственно таких участков очень большое количество, меняется только конструктор фреймов. Можно ли как то выделить этот код в метод?
UPD1: Ещё пример

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                /*Если окно уже создано и не закрыто, то выводим на передний план*/
                if((ptf != null) && !ptf.isClosed()){
                    theDesctop.add(ptf, 0);
                    try {
                        ptf.setSelected(true);
                    } catch (PropertyVetoException e1)
                        {e1.printStackTrace();}
                }else{
                    xLocation += 26;
                    yLocation += 26;
                    if(xLocation > 78 && yLocation > 78){
                        xLocation = 26;
                        yLocation = 26;
                    }
                    //ptf = new ProductTypeFrame("СМС: Тип изделия", 20, 30, 220, 240);
                    ptf = new ProductTypeFrame("СМС: Тип изделия", xLocation, yLocation, 220, 240);
                    theDesctop.add(ptf, 0);
                    ptf.setVisible(true);
                }
            }
        });
Answer 1

Исхожу из предположения, что ProductTypeFrame и NodeFrame имеют общего родителя или интерфейс, назовем его Frame.

Ваш код по сути выполняет показ Frame, лежащего в некотором поле. Если поле неинициализировано или Frame уже был закрыт, вы создаете новое. По сути вы хотите вынести из этого кода создание экземпляра и присвоение его полю. В конструктор при этом должны попасть параметры xLocation и yLocation. Для инкапсуляции создания экземпляра класса подходит шаблон проектирования Абстрактная фабрика. Мы применим упрощенную реализацию на лямбдах.

Обернем ваш код в метод, который будет принимать параметром лямбду, служащую оберткой для конструктора, и вызывать ее, когда потребуется создать объект. Метод также будет возвращать старый или вновь созданный экземпляр Frame, чтобы мы могли присвоить его в переменную/поле.

public Frame forceShow(Frame frame, BiFunction<Integer, Integer, Frame> frameSupplier) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            /*если окно уже создано и не закрыто, то выводим на передний план*/
            if((frame != null) && !frame.isClosed()){
                theDesktop.add(frame, 0);
                try {
                    frame.setSelected(true);
                } catch (PropertyVetoException e1){
                    e1.printStackTrace();
                }
            } else {
                xLocation += 26;
                yLocation += 26;
                if(xLocation > 78 && yLocation > 78){
                    xLocation = 26;
                    yLocation = 26;
                }
                frame = frameSupplier.apply(xLocation, yLocation);
                theDesktop.add(frame, 0);
                frame.setVisible(true);
            }
            return frame;
        }
    });  
}

Теперь мы можем показать разные виды Frame:

nf = forceShow(nf, (x, y) -> new NodeFrame("СМС: Узлы", x, y, 405, 500));
ptf = forceShow(ptf, (x, y) -> new ProductTypeFrame("СМС: Тип изделия", x, y, 220, 240));

Конструктор будет вызван, только когда метод forceShow вызовет frameSupplier.apply()

Answer 2
    if((nf != null) && !nf.isClosed()){
        theDesctop.add(nf, 0);
        try {
            nf.setSelected(true);
        } catch (PropertyVetoException e1)
            {e1.printStackTrace();}
    }

можно выделить в отдельный метод и передавать nf или ptf. Из метода возвращать boolean значение и на основе него делать блок else дальше

xLocation += 26;
yLocation += 26;
if(xLocation > 78 && yLocation > 78){
   xLocation = 26;
   yLocation = 26;
}

это точно можно в отдельный метод выкинуть.

Либо можно заморочиться с рефлексией и выделить все в отдельный метод, в него передавать объект nf/ptf + Class который надо создать. В методе использовать не прямой конструктор f Class.newInstance.

READ ALSO
Design patterns [требует правки]

Design patterns [требует правки]

To gain a popularity among the business’ competitors, GeekMoviesuz should provide a various qualities for the content on the site

237
Java. Web Browser

Java. Web Browser

Всем привет! Взял на курсач браузер на JavaСделал костяк, с вкладками

198
Двойная сортировка в Map

Двойная сортировка в Map

Добрый деньможет кто подскажет, уже все перепробовал Есть мапа Map<List<String>, Integer> mapDistanceSort = new LinkedHashMap<>();

433
Java JSP Tomcat доступ по ip

Java JSP Tomcat доступ по ip

Запускаю томкет, деплоится туда варник и через localhost могу зайтиКак сделать, чтобы я попадал на страничку по внутреннему айпишнику компа и с других...

199