Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Список окон в MDI, сделать список в меню Window 
V
    Опции темы
_Y_
Дата 21.5.2007, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 1
Всего: 34



Заморочился с постройкой MDI. В меню Window - список дочерних окон - так же как в MS Word, например. Естественно, открытие нового окна дополняет список, закрытие - укорачивает, клик на менюшке отдает окошку фокус.

Все работает, но построена жуткая крокозябра. Должно быть какое-то красивое, а скорее всего, стандартное для Java GUI решение. Подскажите, пожалуйста. Зациклился smile 


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
powerOn
Дата 21.5.2007, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 31
Всего: 159



Цитата(_Y_ @  21.5.2007,  15:52 Найти цитируемый пост)
Все работает, но построена жуткая крокозябра. Должно быть какое-то красивое, а скорее всего, стандартное для Java GUI решение. Подскажите, пожалуйста. Зациклился smile  

ну так покажи как сделал.  посмотрим что к чему. smile 
Лично я стандартных решений не видел, но сделать самому все это не так уж и сложно.

Я вот накатал пример на скорую руку, может какие мысли тебе понравятся. smile 

Простейщий JInternalFrame.
Код

package wintest;

public class MyInternalFrame extends javax.swing.JInternalFrame
{
    public MyInternalFrame()
    {
        initComponents();
    }
                         
    private void initComponents()
    {
        setClosable(true);
        setIconifiable(true);
        setMaximizable(true);
        setResizable(true);
        try
        {
            setSelected(true);
        } 
        catch (java.beans.PropertyVetoException e1)
        {
            e1.printStackTrace();
        }
        setVisible(true);
        pack();
    }                       
}


Элемент меню (подготовлен для связки с JInternalFrame).
Код

package wintest;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyVetoException;
import javax.swing.JInternalFrame;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.event.InternalFrameAdapter;
import javax.swing.event.InternalFrameEvent;

public class MyMenuItem extends JMenuItem
{
    private JInternalFrame internalFrame = null;

    public MyMenuItem()
    {
        addActionListener(new ActionListener()
        {
            // Обработчик действия меню. (Активируем окно)
            public void actionPerformed(ActionEvent e)
            {
                if(internalFrame != null)
                {
                    System.out.println("Select Window: " + internalFrame.getTitle());
                    try
                    {
                        internalFrame.setSelected(true);
                    }
                    catch (PropertyVetoException ex)
                    {
                        ex.printStackTrace();
                    }
                }
            }
        });
    }
    
    public JInternalFrame getInternalFrame()
    {
        return internalFrame;
    }
    
    public void setInternalFrame(JInternalFrame internalFrame)
    {
        if (this.internalFrame == null)
        {
            this.internalFrame = internalFrame;
            this.setText(internalFrame.getTitle());
            System.out.println(internalFrame.getTitle());
            internalFrame.addInternalFrameListener(new InternalFrameAdapter()
            {
                public void internalFrameClosing(InternalFrameEvent e)
                {
                    System.out.println("Remove Window: " + MyMenuItem.this.internalFrame.getTitle());
                    JPopupMenu menu = (JPopupMenu) MyMenuItem.this.getParent();
                    menu.remove(MyMenuItem.this);
                    menu.validate();
                }
            });
            
            try
            {
                internalFrame.setSelected(true);
            }
            catch (PropertyVetoException ex)
            {
                ex.printStackTrace();
            }
        }
    }
}


Главное окно.
Код

package wintest;

import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.DesktopManager;
import javax.swing.JInternalFrame;
import javax.swing.JOptionPane;

public class NewJFrame extends javax.swing.JFrame
{
    public NewJFrame()
    {
        initComponents();
        setLocationRelativeTo(null);
    }
                         
    private void initComponents()
    {
        jDesktopPane1 = new javax.swing.JDesktopPane();
        jMenuBar2 = new javax.swing.JMenuBar();
        jActionMenu = new javax.swing.JMenu();
        jAddWindowMenu = new javax.swing.JMenuItem();
        jRemoveWindowMenu = new javax.swing.JMenuItem();
        jSeparator1 = new javax.swing.JSeparator();
        jExitMenu = new javax.swing.JMenuItem();
        jWindowMenu = new javax.swing.JMenu();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Window Test");
        getContentPane().add(jDesktopPane1, java.awt.BorderLayout.CENTER);

        jActionMenu.setText("Actions");
        jAddWindowMenu.setText("Add Window");
        jAddWindowMenu.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                jAddWindowMenuActionPerformed(evt);
            }
        });

        jActionMenu.add(jAddWindowMenu);

        jRemoveWindowMenu.setText("Remove Window");
        jRemoveWindowMenu.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                jRemoveWindowMenuActionPerformed(evt);
            }
        });

        jActionMenu.add(jRemoveWindowMenu);
        jActionMenu.add(jSeparator1);

        jExitMenu.setText("Exit");
        jExitMenu.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                jExitMenuActionPerformed(evt);
            }
        });

        jActionMenu.add(jExitMenu);
        jMenuBar2.add(jActionMenu);
        jWindowMenu.setText("Windows");
        jMenuBar2.add(jWindowMenu);
        setJMenuBar(jMenuBar2);
        pack();
    }                       
    
    private void jRemoveWindowMenuActionPerformed(java.awt.event.ActionEvent evt)                                                  
    {                                                      
        // Удаляем активное окно.
        jDesktopPane1.getSelectedFrame().doDefaultCloseAction();
    }                                                 
    
    private void jExitMenuActionPerformed(java.awt.event.ActionEvent evt)                                          
    {                                              
        // Завершение программы.
        System.exit(0);
    }                                         
    
    private void jAddWindowMenuActionPerformed(java.awt.event.ActionEvent evt)                                               
    {                                                   
        // Получаем заголовок для нового окна
        String name = JOptionPane.showInternalInputDialog(jDesktopPane1, "Enter window name: ");
        
        // Проверяем его валидность
        if((name == null) || (name.length() == 0))
        {
            JOptionPane.showInternalMessageDialog(
                    jDesktopPane1, "Invalid name!");
            return;
        }
        
        // Проверяем наличие окна с аналогичным заголовком.
        for(JInternalFrame frame : jDesktopPane1.getAllFrames())
        {
            if(frame.getTitle().equals(name))
            {
                JOptionPane.showInternalMessageDialog(
                        jDesktopPane1, "Window with name \"" + name + "\" already exists");
                return;
            }
        }
        
        DesktopManager dManager = jDesktopPane1.getDesktopManager();
        
        // Создаем новое окно.
        MyInternalFrame iframe = new MyInternalFrame();
        iframe.setSize(200, 100);
        iframe.setTitle(name);
        jDesktopPane1.add(iframe);
        iframe.setVisible(true);
        iframe.setLocation(50, 50);
        
        // Связываем с элементом меню.
        MyMenuItem menuItem = new MyMenuItem();
        menuItem.setInternalFrame(iframe);
        jWindowMenu.add(menuItem);
    }                                              

    public static void main(String args[])
    {
        java.awt.EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                new NewJFrame().setVisible(true);
            }
        });
    }
                   
    private javax.swing.JMenu jActionMenu;
    private javax.swing.JMenuItem jAddWindowMenu;
    private javax.swing.JDesktopPane jDesktopPane1;
    private javax.swing.JMenuItem jExitMenu;
    private javax.swing.JMenuBar jMenuBar2;
    private javax.swing.JMenuItem jRemoveWindowMenu;
    private javax.swing.JSeparator jSeparator1;
    private javax.swing.JMenu jWindowMenu;
}





--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
_Y_
Дата 22.5.2007, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 1
Всего: 34



powerOn, спасибо, даже не ожидал таких больших трудозатрат. Сейчас к сожалению работы навалило, приходится отложить эту проблему на потом. Но когда добью отрапортую. Думаю, не мне одному может быть интресно.


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
_Y_
Дата 23.5.2007, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 1
Всего: 34



powerOn, вот утром до работы встал разобраться с Вашим кодом. Все работает красиво и приятно smile  Единственно, я бы попытался загнать MyInternalFrame и MyMenuItem в один объект раз уж они существовать могут только в паре smile 

ЗЫ:  В NewJFrame лишняя строка, похоже,
Код

DesktopManager dManager = jDesktopPane1.getDesktopManager();


Это сообщение отредактировал(а) _Y_ - 23.5.2007, 08:44


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
powerOn
Дата 23.5.2007, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 31
Всего: 159



Цитата(_Y_ @  23.5.2007,  09:43 Найти цитируемый пост)
ЗЫ:  В NewJFrame лишняя строка, похоже,

Угумс. Похоже на то.  smile 

Цитата(_Y_ @  23.5.2007,  09:43 Найти цитируемый пост)
Единственно, я бы попытался загнать MyInternalFrame и MyMenuItem в один объект раз уж они существовать могут только в паре 

А почему бы и нет... Вы в праве доработать его по своему усмотрению...


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0529 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.