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);
}
}
});
Исхожу из предположения, что 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()
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.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
To gain a popularity among the business’ competitors, GeekMoviesuz should provide a various qualities for the content on the site
Добрый деньможет кто подскажет, уже все перепробовал Есть мапа Map<List<String>, Integer> mapDistanceSort = new LinkedHashMap<>();
Запускаю томкет, деплоится туда варник и через localhost могу зайтиКак сделать, чтобы я попадал на страничку по внутреннему айпишнику компа и с других...