Цитата(_Y_ @ 21.5.2007, 15:52 ) | | Все работает, но построена жуткая крокозябра. Должно быть какое-то красивое, а скорее всего, стандартное для Java GUI решение. Подскажите, пожалуйста. Зациклился 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; }
|
--------------------
 нет времени думать - нужно писать КОД!
|