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.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости