Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
 Аватар для r@di0
103 / 92 / 20
Регистрация: 24.01.2009
Сообщений: 519

Особенности окон Java-приложений

11.08.2011, 15:35. Показов 2195. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть приложение на Java. Запускаю под Windows.
Задача: найти кнопку и послать ей сообщение.
Проблема: Не могу докопаться до дочерних компонентов.
Окна верхнего уровня нахожу (на WinAPI через EnumWindows) без проблем, но дальше пройти не удаётся.
Смотрел так же через WinSight32 - элементов ниже верхнего уровня нет.
Но в программе-то они есть, и я их вижу
----
Вот и возникает вопрос: с чем это связанно? и как всё-же добраться до нужной кнопки?

Добавлено через 7 минут
Наверно лучше перенести в WinAPI
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.08.2011, 15:35
Ответы с готовыми решениями:

Какие особенности работы с Sun Java Web Server 2.0?
Какие особенности работы с Sun Java Web Server 2.0? В сравнении с Tomcat, JRun, JBoss, etc что лучше и почему?

Какие особенности характерны для компонентной модели платформы JAVA ?
Подскажите какие ответы выбрать. Я просто С++ изучаю, а в java дуб дубом. организация в компонентных классах доступа к закрытым...

Запуск Java приложений
Доброго времени суток! Возник такой вопрос: А какие способы есть для запуска Java приложений? Вот например для C/C++ и тому подобное...

6
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
11.08.2011, 15:59
До дочерних компонентов Вы не сможете докопаться при всем желании, ибо их просто нет. Есть Frame. Всё, что внутри него - результат рисования. Кнопок как компонент формы в том виде, как Вы привыкли видеть в windows, не существует.

P.S. Разве что приложение написано на AWT, в чем я сильно сомневаюсь. Там - да, каждый компонент в итоге имеет system peer component.
2
 Аватар для r@di0
103 / 92 / 20
Регистрация: 24.01.2009
Сообщений: 519
18.08.2011, 17:39  [ТС]
Собственно на этом проблемы на закончились:
1. Приходится кликать мышью по кнопкам в окне стороннего приложения. При этом мне нужно то и дело активизировать это окно, переключаться к своему, запускать и закрывать другую программу и т.д.

Вопрос: Что можно сделать, чтобы все эти манипуляции оставались незаметны для пользователя, и чтобы он не смог повлиять на процесс нажатием кнопок мыши и/или клавиатуры?

2. При разных разрешениях какие-то клики проходят, а какие-то нет.

Вопрос: Как определить координаты кнопки, по которой необходимо кликнуть, с учетом разрешения?
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
19.08.2011, 11:33
1. Единственный вариант, который я вижу - посылать окну на уровне OS сообщения о кликах мышью в нужных точках. Активируется ли оно при этом - не знаю. Пользователь при этом сможет влиять на происходящее, от этого никуда не уйти.

2. Тут всё еще сложнее. В Java в подавляющем большинстве случаев применяется логическая раскладка. И просчитать координаты кнопки можно только зная параметры этой раскладки. Почитайте для интереса вот это , в особенности про GridBagLayout. Лучше поймете масштабы стоящей перед Вами задачи.

P.S. А Вы что вообще делаете такое?
0
 Аватар для r@di0
103 / 92 / 20
Регистрация: 24.01.2009
Сообщений: 519
19.08.2011, 13:27  [ТС]
я пошел дальше
- хочу с помощью MBeans подключиться к интерфейсу и выполнять нужные действия.
Если учесть, что это моё первое серъезное знакомство с java, то читаю это.
и Монахова "Руководство программиста Enterprise JavaBeans".
Насколько я начинаю понимать, мне надо экспортировать функции, которые вызывается при нажатии кнопок в виде MBean operation. Вчера просматривал файлы через Java Decompiler, но пока ничего не нашел. Довольно трудно въехать во всё сходу
Любая информация по данному вопросу будет полезной

Добавлено через 5 минут
Цитата Сообщение от Skipy Посмотреть сообщение
А Вы что вообще делаете такое?
В программе есть функция выгрузки отчетов в XLS.
Мне нужно выгружать их и отправлять на сервер,
чтобы потом можно было просмотреть отчеты через Web-интерфейс.
0
 Аватар для r@di0
103 / 92 / 20
Регистрация: 24.01.2009
Сообщений: 519
22.08.2011, 18:47  [ТС]
Вроде раскопал что нужно:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public void mousePressed(MouseEvent paramMouseEvent)
  {
    Object localObject = paramMouseEvent.getSource();
    if ((localObject instanceof JTree))
    {
      JTree localJTree = (JTree)localObject;
      TreePath localTreePath = localJTree.getPathForLocation(paramMouseEvent.getX(), paramMouseEvent.getY());
      if ((localTreePath != null) && (paramMouseEvent.getClickCount() == 2))
      {
        DefaultMutableTreeNode localDefaultMutableTreeNode = (DefaultMutableTreeNode)localTreePath.getLastPathComponent();
        if (localDefaultMutableTreeNode.isLeaf())
        {
          XItem localXItem = (XItem)localDefaultMutableTreeNode.getUserObject();
          AWTEventDispatcher.getInstance().handleEvent(8, (String)localXItem.getReference(), this);
        }
      }
    }
  }
Эта функция нажатия мыши в дереве (мне нужно выбрать лист в дереве, прежде чем выгружать данные). Насколько я могу судить многие события в итоге сводятся к вызову AWTEventDispatcher.getInstance().handleE vent:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public synchronized void handleEvent(int paramInt, String paramString, Adapter paramAdapter)
  {
    Vector localVector = new Vector();
    String str1 = paramAdapter.getName();
    EventHandler localEventHandler;
    for (int i = 0; i < this.jdField_a_of_type_JavaUtilVector.size(); i++)
    {
      localEventHandler = (EventHandler)this.jdField_a_of_type_JavaUtilVector.elementAt(i);
      if ((paramInt & localEventHandler.eventsMask) != paramInt)
        continue;
      for (int j = 0; j < localEventHandler.sourceFilter.length; j++)
      {
        String str2 = localEventHandler.sourceFilter[j];
        int k = str2.indexOf("@");
        if (k != -1)
        {
          if (!str2.substring(k + 1).equals(str1))
            break;
          str2 = str2.substring(0, k);
        }
        if (((paramString == null) || (!paramString.matches(str2))) && (!str2.equals("any")))
          continue;
        localVector.addElement(localEventHandler);
        break;
      }
    }
    if (localVector.size() == 0)
      return;
    for (i = 0; i < localVector.size(); i++)
    {
      localEventHandler = (EventHandler)localVector.get(i);
      new b(this, localEventHandler, paramString, paramAdapter).start();
    }
  }
Получается нужно экспортировать эту функцию?
До конца не въеду как использовать MBean'ы...
Пишем интерфейс, пишем сервер для запуска MBean, пишем класс, реализующий интерфейс, и в классе просто вызываем функцию handleEvent или как?
Skipy, не просветите в двух словах?
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
23.08.2011, 12:42
Ну, могу привести пример. Я как-то экспериментировал с установкой уровня логирования Log4J через JMX.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
package ru.skipy.log4j;
 
import org.apache.log4j.Level;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.apache.log4j.xml.DOMConfigurator;
 
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.management.ManagementFactory;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
/**
 */
public class MBeanTestFrame extends JFrame {
 
    private static final Logger logger = Logger.getLogger(MBeanTestFrame.class);
 
    MBeanTestFrame() {
        super("Log4J Management MBean test");
        JButton btn = new JButton("Test log");
        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                test();
            }
        });
 
        JPanel cp = new JPanel(new BorderLayout());
        setContentPane(cp);
        cp.add(btn, BorderLayout.CENTER);
        setSize(400, 300);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
 
    public static void main(String[] args) throws Exception {
        DOMConfigurator.configure("src/log4j.xml1");
        initMBean();
        System.out.println("PID: "+getPID());
        new MBeanTestFrame().setVisible(true);
    }
 
    private static void initMBean() throws Exception {
        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
        ObjectName name = new ObjectName("ru.skipy.logging:type=LoggerManager");
        Log4JManager mbean = new Log4JManager();
        mbs.registerMBean(mbean, name);
    }
 
    private static String getPID() {
        String name = ManagementFactory.getRuntimeMXBean().getName();
        Pattern p = Pattern.compile("(\\d+)@.+");
        Matcher m = p.matcher(name);
        if (m.matches()) {
            return m.group(1);
        }
        return name;
    }
 
    private void test() {
        System.out.println("Testing all levels:\n====================");
        System.out.println("Trace: ");
        logger.trace("TRACE message");
        System.out.println("Debug: ");
        logger.debug("DEBUG message");
        System.out.println("Info: ");
        logger.info("INFO message");
        System.out.println("Warn: ");
        logger.warn("WARN message");
        System.out.println("Error: ");
        logger.error("ERROR message");
        System.out.println("Fatal: ");
        logger.fatal("FATAL message");
        System.out.println("Done\n====================");
    }
 
    public static interface Log4JManagerMBean {
 
        public void setTraceLevel();
 
        public void setDebugLevel();
 
        public void setInfoLevel();
 
        public void setWarnLevel();
 
        public void setErrorLevel();
 
        public void setFatalLevel();
 
    }
 
    public static class Log4JManager implements Log4JManagerMBean {
 
        private Logger getLogger() {
            return LogManager.getLogger("ru.skipy.log4j");
        }
 
        @Override
        public void setTraceLevel() {
            getLogger().setLevel(Level.TRACE);
        }
 
        @Override
        public void setInfoLevel() {
            getLogger().setLevel(Level.INFO);
        }
 
        @Override
        public void setDebugLevel() {
            getLogger().setLevel(Level.DEBUG);
        }
 
        @Override
        public void setWarnLevel() {
            getLogger().setLevel(Level.WARN);
        }
 
        @Override
        public void setFatalLevel() {
            getLogger().setLevel(Level.FATAL);
        }
 
        @Override
        public void setErrorLevel() {
            getLogger().setLevel(Level.ERROR);
        }
    }
}
Логгер можно оставить за кадром, принцип не меняется. Делаем интерфейс, делаем реализацию. Регистрируем. Все, можно через JMX вызывать функции. Я это тестировал через JConsole, она умеет подсоединяться в приложению (нужно знать PID, но я его вывожу).

А вообще JMX достаточно хорошо описан вот тут: http://download.oracle.com/jav... index.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.08.2011, 12:42
Помогаю со студенческими работами здесь

Интернационализация приложений на Java
Собственно о способах я уже прочел и остановился на properties файлах. Меня интересует другой вопрос. Вот допустим послал я человеку...

Структуры приложений на java
Здравствуйте, как называется структура приложения с использованием Service, DAO, DAOImpl? И где можно почитать о том, какие структуры...

Изменение шрифтов (хотя бы размер) в Java для отображения Java-приложений в Windows
здравствуйте! подскажите, пожалуйста, есть ли возможность через некие твики или патчи самой Java для Windows или же твики самой Windows...

Обновление java-приложений
Как-то писал программки для себя и особо не задумывался над обновлением. А тут попросили накидать простенькую программу для корпоративной...

Особенности разработки корпоративных приложений
Почему выбирают Java в качестве языка разработки (не будем брать поддержку). Понятно дело, что огромное кол-во enterprise-приложений на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru