понедельник, 8 апреля 2013 г.

Контекстное меню с командами вырезать, копировать, вставить, выделить всё для JTextComponent на java

В этой статье я хочу привести пример всплывающего по щелчку правой клавишей мыши меню с командами вырезать, копировать, вставить, выделить всё. Данное меню выполнено в виде класса, реализующего интерфейс MouseListener, для использования его следует просто добавить к компоненту расширяющему JTextComponent (JTextField, JEditorPane и т.д.) методом addMouseListener(). Ненужные команды меню автоматически скрываются, отображаются только те, выполнение которых возможно с текущим компонентом в текущем состоянии. Если никакие команды не могут быть выполнены, меню попросту не отображается.

вторник, 11 декабря 2012 г.

Использование Look And Feel в приложениях на java

Поддержка Look And Feel - очень важная и достаточно необычная особенность языка программирования java. С использованием Look And Feel можно одной командой изменить стиль всех окон и диалогов в приложении. Существует около десятка стандартных Look And Feel встроенных в java, а помимо этого возможна установка сторонних Look And Feel и самостоятельное создание их. LookAndFeel крайне удобны тем, что с их помощью можно стандартизировать оформление всего приложения, и затем, при необходимости, легко изменять стили оформления одновременно для всех элементов приложения.

пятница, 14 сентября 2012 г.

Перенаправление сообщений со стандартного потока вывода system.out в логгер log4j на java

В коде своих приложений для логирования я везде стараюсь использовать библиотеку log4j, однако во многих сторонних библиотеках часто используются другие средства логирования, в частности стандартные потоки вывода System.out и System.err (методы System.out.println() и т.д.). При работе приложения такие сообщения и информация которую они несут, могут попросту потеряться, если их не перехватывать. Для перехвата таких сообщений и был написан класс, приведенный ниже.

пятница, 3 августа 2012 г.

Удобная генерация serialVersionUID в NetBeans

Очень важно, чтобы для классов, реализующих интерфейс Serializable был определен serialVersionUID, почему, можно прочитать здесь.
Как известно большинству разработчиков, работающих в NetBeans - по умолчанию в NetBeans отсутствует возможность сгенерировать щелчком мыши serialVersionUID для класса реализующего интерфейс Serializable. Поэтому чтобы избежать повторения uid-ов приходится либо каким-то образом запоминать создаваемые uid-ы, либо писать случайные цифры и надеяться на удачу. Можно конечно использовать утилиту serialver, однако это очень неудобно.

суббота, 30 июня 2012 г.

Работа с системном треем (system tray) на java

Для размещения иконки в трее можно воспользоваться стандартным классом java.awt.SystemTray, который стал доступен начиная с 6-й версии java. Данный класс воплощает собой системный трей среды в которой запущена виртуальная машина java. Перед началом работы с треем необходимо обязательно проверить его доступность с помощью метода SystemTray.isSupported(), далее следует получить текущий экземпляр SystemTray методом SystemTray.getSystemTray(). Вполне логично, что класс SystemTray является синглтоном, т.е. любое java приложение может иметь только один экземпляр SystemTray.
Системный трей может содержать некоторое количество иконок. Добавление иконок в системый трей производится с использованием команды add(java.awt.TrayIcon), а удаление командой remove(java.awt.TrayIcon).
Ниже привожу пример с официального сайта Oracle, в котором демонстрируется использование системного трея

final TrayIcon trayIcon;

if (SystemTray.isSupported()) {

    SystemTray tray = SystemTray.getSystemTray();
    Image image = Toolkit.getDefaultToolkit().getImage("tray.gif");

    MouseListener mouseListener = new MouseListener() {
                
        public void mouseClicked(MouseEvent e) {
            System.out.println("Tray Icon - Mouse clicked!");                 
        }

        public void mouseEntered(MouseEvent e) {
            System.out.println("Tray Icon - Mouse entered!");                 
        }

        public void mouseExited(MouseEvent e) {
            System.out.println("Tray Icon - Mouse exited!");                 
        }

        public void mousePressed(MouseEvent e) {
            System.out.println("Tray Icon - Mouse pressed!");                 
        }

        public void mouseReleased(MouseEvent e) {
            System.out.println("Tray Icon - Mouse released!");                 
        }
    };

    ActionListener exitListener = new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            System.out.println("Exiting...");
            System.exit(0);
        }
    };
            
    PopupMenu popup = new PopupMenu();
    MenuItem defaultItem = new MenuItem("Exit");
    defaultItem.addActionListener(exitListener);
    popup.add(defaultItem);

    trayIcon = new TrayIcon(image, "Tray Demo", popup);

    ActionListener actionListener = new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            trayIcon.displayMessage("Action Event", 
                "An Action Event Has Been Performed!",
                TrayIcon.MessageType.INFO);
        }
    };
            
    trayIcon.setImageAutoSize(true);
    trayIcon.addActionListener(actionListener);
    trayIcon.addMouseListener(mouseListener);

    try {
        tray.add(trayIcon);
    } catch (AWTException e) {
        System.err.println("TrayIcon could not be added.");
    }

} else {

    //  System Tray is not supported

}

В вышеприведенном примере есть один существенный недочет - для всплывающего меню там используется тяжеловесный устарелый компонент java.awt.PopupMenu, одним из недостатков которого является невозможность установки иконок для его MenuItem'ов. Несмотря на то, что TrayIcon по умолчанию принимает в своем конструкторе только java.awt.PopupMenu, возможность использовать более продвинутый javax.swing.JPopupMenu все же существует. Необходимо добавить к TrayIcon MouseListener, который будет создавать JPopupMenu при своем срабатывании. Ниже приведен пример такой реализации.

final TrayIcon trayIcon;

        if (SystemTray.isSupported()) {

            SystemTray tray = SystemTray.getSystemTray();
            Image image = Toolkit.getDefaultToolkit().getImage("tray.gif");



            ActionListener exitListener = new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                    System.out.println("Exiting...");
                    System.exit(0);
                }
            };

            final JPopupMenu popup = new JPopupMenu();
            JMenuItem defaultItem = new JMenuItem("Exit");
            defaultItem.addActionListener(exitListener);
            popup.add(defaultItem);

            trayIcon = new TrayIcon(image, "Tray Demo");

            ActionListener actionListener = new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                    trayIcon.displayMessage("Action Event",
                            "An Action Event Has Been Performed!",
                            TrayIcon.MessageType.INFO);
                }
            };

            trayIcon.setImageAutoSize(true);
            trayIcon.addActionListener(actionListener);
            trayIcon.addMouseListener(new MouseAdapter() {

                @Override
                public void mouseReleased(MouseEvent e) {
                    if (e.isPopupTrigger()) {
                        popup.setLocation(e.getX(), e.getY());
                        popup.setInvoker(popup);
                        popup.setVisible(true);
                    }
                }
            });

            try {
                tray.add(trayIcon);
            } catch (AWTException e) {
                System.err.println("TrayIcon could not be added.");
            }

        } else {
            //  System Tray is not supported
        }

среда, 30 мая 2012 г.

Как остановить веб приложение java на Apache Tomcat непосредственно из програмного кода

Остановку веб приложения java на Tomcat из программного кода можно выполнить путем посылки команды выключения на специальный порт, который может быть настроен в корневом элементе файла server.xml Томката.

Итак, алгоритм действий по шагам:

1. Добавить в корневой элемент файла CATALINA_HOME/conf/server.xml код, приведенный ниже:

<server port="8005" shutdown="myShutDownCommand">

Аттрибут port не обязателен. Если он пропущен - то будет использован порт по умолчанию - 8005. Значением аттрибута shutdown может быть все что угодно. Это значение не должно быть известно никому кроме вас.

Может возникнуть сложность в нахождении файла server.xml. Он может оказаться в различных местах. У меня при использовании Netbeans 7.1.2 он оказался в директории вида C:\Documents and Settings\<UserName>\.netbeans\7.1.2\apache-tomcat-7.0.22.0_base\conf. Файл server.xml есть также по пути вида C:\Program Files\Apache Software Foundation\Apache Tomcat 7.0.22\conf - путь к нужному файлу будет зависеть от того, с какими параметрами был запущен томкат.

2. Создать код в java программе, который будет посылать команду остановки используя java.net.Socket на порт остановки tomcat.

try { 
    Socket socket = new Socket("localhost", 8005); 
    if (socket.isConnected()) { 
        PrintWriter pw = new PrintWriter(socket.getOutputStream(), true); 
        pw.println("myShutDownCommand");//send shut down command 
        pw.close(); 
        socket.close(); 
    } 
} catch (Exception e) { 
    e.printStackTrace(); 
}

пятница, 18 мая 2012 г.

Как единоразово выполнить некоторый код в java при запуске web приложения на Apache Tomcat

Чтобы выполнить некоторый код единоразово при запуске веб приложения на Apache Tomcat (например создать иконку в трее и т.д.) следует сконфигурировать listener в файле web.xml

Итак, по шагам:

1. Добавляем в раздел <web-app> код листенера со ссылкой на наш класс.

<listener>
    <listener-class>mypackage.StartListener</listener-class>
</listener>


2. Создаем класс своего листенера наследуясь от javax.servlet.ServletContextListener.

package mypackage;

import javax.servlet.ServletContextEvent;

/**
 *
 * @author Cloud
 */
public class StartListener implements javax.servlet.ServletContextListener {

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
         // код выполняющийся при уничтожении контейнера
    }

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        // код выполняющийся при инициализации контейнера
    }
}

Ярлыки

java (31) оптимизация (7) CPanel (5) svn (5) windows xp (5) ошибка (5) свой сервер (5) файлы и папки (5) gui (4) регулярные выражения (4) jacoco (3) redmine (3) windows (3) автоматизация (3) защита данных (3) резервное копирование (3) сервер (3) JavaScript (2) Oracle SQL (2) adsl модем (2) apache maven (2) apache tomcat (2) coverage (2) dropbox (2) excel (2) firewall (2) netbeans (2) office 2007 (2) samsung (2) system tray (системный трей) (2) xerox (2) вирусы (2) принтер (2) сериализация (2) удаленный рабочий стол (2) HTML (1) JFileChooser (1) MySQL (1) Nokia (1) Ovi (1) P660R-T1 (1) WakeOnLan (1) blogger.com (1) ctfmon.exe (1) email (1) flash память (1) ftp (1) integration testing (1) ip (1) jQuery (1) jvisualWm (1) log4j (1) look and feel (1) myBatis (1) php (1) serialVersionUID (1) skype (1) smtp (1) ssh (1) swing (1) torrents (1) unit-testing (1) unix (1) vpn (1) windows 7 (1) xStarter (1) zip (1) безопасность (1) вход в систему (1) дизайн (1) документация (1) заправка (1) интернет (1) логирование (1) мышь (1) патч (1) перенос (1) печать (1) плагины (1) почтовые сообщения (1) программирование (1) процессы (1) прошивка (1) сеть (1) сеть. ошибка (1) скрытые файлы (1) списки (1) фильтрация (1) фокус (1) часовые пояса (1) шифрование (1) экран (1)