Страница 2 из 3
Добавлено: 04 май 2006, 16:15
Oscar
keo, хороший вопрос.
Наверняка сказать не могу.
Чтобы не задумываться, можно в
actionPerformed запихнуть:
Добавлено: 05 май 2006, 11:05
keo
Oscar, спасибо!
setVisible(true); - должна быть последняя операция в конструкторе!
Столько боков было и все из-за того, что сначала делал форму видимой, а потом уже раставлял и настраивал компоненты! И главное эту особенность не в одной книге не встречал (может я не те книги читаю)!
contPane.setLayout(null);
очень не надёжная конструкция
ну а если окно имеет постоянный размер? что может случится?
Добавлено: 17 май 2006, 18:44
Gugle
Доброго времени суток!
Можете подсказать пример MDI-интерфейса, но не обычная вставка "Документа".
Например:
В главном меню есть
"Вид
--> Доп. окно 1 (Оформлен в виде CheckBox)
--> Доп. окно 2 (Оформлен в виде CheckBox)
--> Доп. окно 3 (Оформлен в виде CheckBox)"
"Основное" окно открыто всегда и когда не открыто ни одно "Доп. окно", оно развернуто на весь экран (или на весь "jDesktopPane").
При установки галочки на "Доп. окно 1" в "jDesktopPane", соответственно, появляется окно за номером 1. При установке галочки на "Доп. окно 2" открывалось окно за номером 2 и т.д.
"Доп окно 1" должно появится на "jDesktopPane" и находится, например, справа от основного окна.
"Доп окно 2" должно появится на "jDesktopPane" и находится, например, слева от основного окна.
"Доп окно 3" должно появится на "jDesktopPane" и находится, например, снизу от основного окна.
При этом, по возможности, все открытые окна должны быть с "плавающими" границами, т.е. пользователь может изменить размер каждого "Доп. окна" потянув за его край.
Добавлено: 17 май 2006, 18:50
Oscar
Gugle, MDI тут ни при чём,
делаешь окно (JFrame), с тулбаром и 3-мя "галочками", вешаешь на них обработчик
и показываешь/скрываешь три других JFrame.
Размеры окон Swing (да не переведётся урожай на его поле) делает сам "плавающими",
а максимизацию основного окна, так же, как и положения доп. окон прийдётся писать ручками.
Добавлено: 17 май 2006, 19:04
Gugle
Oscar.
Думаете?
Что то с трудом верится что Word, Exel, тот же Explorer и многие другие программы, у которых множество боковых вспывающих окошек, сделаны не на основе MDI, а с использованием "многоформенности" (если можно так выразится).
Хотя... Разубедите меня.
З.Ы. Возможно я не правильно понимаю саму суть MDI-интерфейса? Веть он должен поддерживать не только вставку одного "документа" в другой, но и всякие "прибамбасы" типа таких вот дополнительных окон...
Добавлено: 17 май 2006, 19:54
Oscar
Gugle, наверное я неправильно понял,
и основное и дополнительные окна должны находиться внутри другого окна, так?
Ок, суть от этого сильно не меняется.
Просто в моём сообщении вместо JFrame нужно читать JInternalFrame
Добавлено: 17 май 2006, 23:40
Gugle
Oscar, брррр.... Стоп! Мы говорим на разных языках что ли?
Для полного пониманя моего вопроса.... Explorer-ом я думаю хоть раз пользовались. Так вот! У него есть менюшка "Избранное", когда на нее нажимаешь, то слева (по умолчанию) появляется (или всплывает, не знаю какое тут уместно выражение) дополнительное "окно", в котором отображаются ссылки на сохраненые пользователем сайты.
Вот что то в этом роде меня и интересует. Я хочу попробовать реализовать что то в этом роде, только в обычной программе, а не в браузере. Если это возможно! Однако я хочу иметь не одно "всплывающее" "боковое" окно, а несколько (точнее слева, справа и снизу).
Так вот! Как я понимаю такой пользовательский интерфейс реализует MDI. А так как такой внешний вид приложения используется довольно таки часто и во многих программах то, что для меня естестесвенно, его реализация должна быть уже да-авно известна широким массам. Уфф!!! Вот!
Хотелось бы посмотреть как решена эта проблема. Может быть я не в ту тему кинул сообщение и этот вопросос не относится к MDI?
Добавлено: 18 май 2006, 14:53
Oscar
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
Остальное - функционал и украшательства...
Добавлено: 18 май 2006, 15:51
Gugle
Oscar.
ВО!!! :P :P То что нужно!!! ОГРОМНОЕ СПАСИБО!!!
Добавлено: 26 май 2006, 12:34
Gugle
Доброго времени суток!
Вопрос по MDI. Создавая окна как показано в примере -->
Можно как-нибуть получить список "имен" всех созданных окон?