Родительские и дочерние окна

Модератор: Absurd

Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

keo, хороший вопрос.

Наверняка сказать не могу.

Чтобы не задумываться, можно в actionPerformed запихнуть:

Код: Выделить всё

dispose();
keo
Сообщения: 46
Зарегистрирован: 25 апр 2006, 17:35
Откуда: Украина, Киев

Oscar, спасибо!
setVisible(true); - должна быть последняя операция в конструкторе!
Столько боков было и все из-за того, что сначала делал форму видимой, а потом уже раставлял и настраивал компоненты! И главное эту особенность не в одной книге не встречал (может я не те книги читаю)!
contPane.setLayout(null);
очень не надёжная конструкция
ну а если окно имеет постоянный размер? что может случится?
Gugle
Сообщения: 22
Зарегистрирован: 17 май 2006, 18:18
Откуда: Москва
Контактная информация:

Доброго времени суток!

Можете подсказать пример MDI-интерфейса, но не обычная вставка "Документа".

Например:
В главном меню есть
"Вид
--> Доп. окно 1 (Оформлен в виде CheckBox)
--> Доп. окно 2 (Оформлен в виде CheckBox)
--> Доп. окно 3 (Оформлен в виде CheckBox)"

"Основное" окно открыто всегда и когда не открыто ни одно "Доп. окно", оно развернуто на весь экран (или на весь "jDesktopPane").
При установки галочки на "Доп. окно 1" в "jDesktopPane", соответственно, появляется окно за номером 1. При установке галочки на "Доп. окно 2" открывалось окно за номером 2 и т.д.

"Доп окно 1" должно появится на "jDesktopPane" и находится, например, справа от основного окна.
"Доп окно 2" должно появится на "jDesktopPane" и находится, например, слева от основного окна.
"Доп окно 3" должно появится на "jDesktopPane" и находится, например, снизу от основного окна.

При этом, по возможности, все открытые окна должны быть с "плавающими" границами, т.е. пользователь может изменить размер каждого "Доп. окна" потянув за его край.
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Gugle, MDI тут ни при чём,
делаешь окно (JFrame), с тулбаром и 3-мя "галочками", вешаешь на них обработчик
и показываешь/скрываешь три других JFrame.

Размеры окон Swing (да не переведётся урожай на его поле) делает сам "плавающими",
а максимизацию основного окна, так же, как и положения доп. окон прийдётся писать ручками.
Gugle
Сообщения: 22
Зарегистрирован: 17 май 2006, 18:18
Откуда: Москва
Контактная информация:

Oscar.
Думаете?

Что то с трудом верится что Word, Exel, тот же Explorer и многие другие программы, у которых множество боковых вспывающих окошек, сделаны не на основе MDI, а с использованием "многоформенности" (если можно так выразится).

Хотя... Разубедите меня.

З.Ы. Возможно я не правильно понимаю саму суть MDI-интерфейса? Веть он должен поддерживать не только вставку одного "документа" в другой, но и всякие "прибамбасы" типа таких вот дополнительных окон...
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Gugle, наверное я неправильно понял,
и основное и дополнительные окна должны находиться внутри другого окна, так?

Ок, суть от этого сильно не меняется.
Просто в моём сообщении вместо JFrame нужно читать JInternalFrame
Gugle
Сообщения: 22
Зарегистрирован: 17 май 2006, 18:18
Откуда: Москва
Контактная информация:

Oscar, брррр.... Стоп! Мы говорим на разных языках что ли?

Для полного пониманя моего вопроса.... Explorer-ом я думаю хоть раз пользовались. Так вот! У него есть менюшка "Избранное", когда на нее нажимаешь, то слева (по умолчанию) появляется (или всплывает, не знаю какое тут уместно выражение) дополнительное "окно", в котором отображаются ссылки на сохраненые пользователем сайты.

Вот что то в этом роде меня и интересует. Я хочу попробовать реализовать что то в этом роде, только в обычной программе, а не в браузере. Если это возможно! Однако я хочу иметь не одно "всплывающее" "боковое" окно, а несколько (точнее слева, справа и снизу).

Так вот! Как я понимаю такой пользовательский интерфейс реализует MDI. А так как такой внешний вид приложения используется довольно таки часто и во многих программах то, что для меня естестесвенно, его реализация должна быть уже да-авно известна широким массам. Уфф!!! Вот!
Хотелось бы посмотреть как решена эта проблема. Может быть я не в ту тему кинул сообщение и этот вопросос не относится к MDI?
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Gugle,

Код: Выделить всё

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

import javax.swing.JCheckBoxMenuItem;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.border.AbstractBorder;
import javax.swing.plaf.basic.BasicInternalFrameUI;

public class Frames extends JFrame implements ActionListener {

	private static final long serialVersionUID = 1L;

	JInternalFrame left, top, right, bottom, main;
	JCheckBoxMenuItem leftMenuItem, rightMenuItem, topMenuItem, bottomMenuItem;

	public Frames() {
		super();

		setDefaultCloseOperation(EXIT_ON_CLOSE);

		setJMenuBar(createMenuBar());

		JDesktopPane desktop = new JDesktopPane();
		desktop.setLayout(new BorderLayout());

		setContentPane(desktop);

		createInternalFrames();
		add(main, BorderLayout.CENTER);

		setSize(800, 600);
		setVisible(true);
	}

	private void createInternalFrames() {
		left = new LayoutInternalFrame(100, 0);
		top = new LayoutInternalFrame(0, 100);
		bottom = new LayoutInternalFrame(0, 100);
		right = new LayoutInternalFrame(100, 0);

		main = new LayoutInternalFrame(0, 0);
		main.setResizable(false);
	}

	private JMenuBar createMenuBar() {
		JMenuBar menuBar = new JMenuBar();

		JMenu menu = new JMenu("View");
		menu.setMnemonic(KeyEvent.VK_V);
		menuBar.add(menu);

		leftMenuItem = new JCheckBoxMenuItem("Left");
		leftMenuItem.addActionListener(this);
		menu.add(leftMenuItem);

		rightMenuItem = new JCheckBoxMenuItem("Right");
		rightMenuItem.addActionListener(this);
		menu.add(rightMenuItem);

		topMenuItem = new JCheckBoxMenuItem("Top");
		topMenuItem.addActionListener(this);
		menu.add(topMenuItem);

		bottomMenuItem = new JCheckBoxMenuItem("Bottom");
		bottomMenuItem.addActionListener(this);
		menu.add(bottomMenuItem);

		return menuBar;
	}

	class LayoutInternalFrame extends JInternalFrame {

		private static final long serialVersionUID = 1L;

		public LayoutInternalFrame(int width, int height) {
			super();
			
			setBorder(new InternalFrameBorder());
			setSize(new Dimension(width, height));
			((BasicInternalFrameUI) getUI()).setNorthPane(null);
			
			setResizable(true);
			setVisible(true);
		}

		public void reshape(int x, int y, int width, int height) {
			super.reshape(x, y, width, height);
			setPreferredSize(new Dimension(width, height));
		}
	}
	
	class InternalFrameBorder extends AbstractBorder {

		private static final long serialVersionUID = 1L;

		private Insets insets = new Insets(2, 2, 2, 2);

		public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) {		
			g.setColor(Color.BLACK);
			g.drawLine(1, 0, w - 2, 0);
			g.drawLine(0, 1, 0, h - 2);
			g.drawLine(w - 1, 1, w - 1, h - 2);
			g.drawLine(1, h - 1, w - 2, h - 1);
		}

		public Insets getBorderInsets(Component c) {
			return insets;
		}

		public Insets getBorderInsets(Component c, Insets newInsets) {
			newInsets.top = insets.top;
			newInsets.left = insets.left;
			newInsets.bottom = insets.bottom;
			newInsets.right = insets.right;
			return newInsets;
		}
	}

	public void actionPerformed(ActionEvent e) {
		if ("Top".equals(e.getActionCommand())) {
			if (topMenuItem.isSelected()) {
				add(top, BorderLayout.NORTH);
			} else {
				remove(top);
			}
		} else if ("Left".equals(e.getActionCommand())) {
			if (leftMenuItem.isSelected()) {
				add(left, BorderLayout.WEST);
			} else {
				remove(left);
			}
		} else if ("Right".equals(e.getActionCommand())) {
			if (rightMenuItem.isSelected()) {
				add(right, BorderLayout.EAST);
			} else {
				remove(right);
			}
		} else if ("Bottom".equals(e.getActionCommand())) {
			if (bottomMenuItem.isSelected()) {
				add(bottom, BorderLayout.SOUTH);
			} else {
				remove(bottom);
			}
		}

		validate();
		repaint();
	}

	public static void main(String[] args) {
		new Frames();
	}

}
((BasicInternalFrameUI) getUI()).setNorthPane(null);

убираем title bar, чтобы запретить dragg

расширяем reshape
чтобы ставить preferred size, необходимо для layout manager

Остальное - функционал и украшательства...
Gugle
Сообщения: 22
Зарегистрирован: 17 май 2006, 18:18
Откуда: Москва
Контактная информация:

Oscar.

ВО!!! :P :P То что нужно!!! ОГРОМНОЕ СПАСИБО!!!
Gugle
Сообщения: 22
Зарегистрирован: 17 май 2006, 18:18
Откуда: Москва
Контактная информация:

Доброго времени суток!

Вопрос по MDI. Создавая окна как показано в примере -->
Можно как-нибуть получить список "имен" всех созданных окон?
Ответить