Страница 1 из 3

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

Добавлено: 25 апр 2006, 17:46
keo
Почти во всех языках программирования есть возможность создания MDI-интерфейса. Есть ли возможность создание таких приложений в Java 2?

Добавлено: 25 апр 2006, 20:12
Oscar
keo,
http://java.sun.com/docs/books/tutorial ... frame.html
http://java.sun.com/docs/books/tutorial ... eDemo.java

В конструкторе MyInternalFrame нужно обязательно сделать:
setSize(200, 100);
и
setVisible(true);

Добавлено: 26 апр 2006, 10:49
keo
Спасибо! Все получилось. Но почему такой внешний вид? Я предполагаю, что это из-за использования компонента JDesktopPane().
Нельзя ли как-нибудь изменить внешний вид?

Добавлено: 26 апр 2006, 14:59
Oscar
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());


forum/viewtopic.php?t=4706

Добавлено: 27 апр 2006, 10:53
keo
Спасибо.

Добавлено: 04 май 2006, 10:57
keo
Как бы в продолжение этой темы.
Нужно из дочернего окна открыть модально диалог. Я пробовал использовать JDialog. Конструктор требует чтобы Owner был либо Dialog либо Frame, а у меня JInternalFrame...

Подскажите как это сделать.

Пытался передавать в дочернее окно ссылку на родительское, а потом использовать ее при вызове диалога - окно появляется, но закрыть его не смог...

Добавлено: 04 май 2006, 11:11
keo
Получилось!!!
keo писал(а):Пытался передавать в дочернее окно ссылку на родительское, а потом использовать ее при вызове диалога - окно появляется, но закрыть его не смог...
Просто вместо Dialog из AWT, попробовал JDialog из Swing

Но может быть кто-нибудь подскажет можно ли JFrame сделать модальным, если можно то как?

Добавлено: 04 май 2006, 14:13
keo
Рано я стал радоваться!

Создал на основе JDialog свой класс

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

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class frmEditPeriodical
    extends JDialog
    implements ActionListener {

  JButton btnOk = new JButton("OK");
  JLabel lbl1 = new JLabel("Дата");
  JLabel lbl2 = new JLabel("Значение");
  JTextField txt1 = new JTextField();
  JTextField txt2 = new JTextField();
  Container contPane;
  
  public frmEditPeriodical(JFrame Owner, String Caption, String Key,
                           String Mode) {
   super(Owner, Caption);
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    setBounds( (screenSize.width - 200) / 2, (screenSize.height - 130) / 2, 200,
              130);
    setVisible(true);
    setResizable(false);
    contPane = this.getContentPane();
    contPane.setLayout(null);
    contPane.add(btnOk);
    contPane.add(lbl1);
    contPane.add(lbl2);
    contPane.add(txt1);
    contPane.add(txt2);
    btnOk.setVisible(true);
    lbl1.setVisible(true);
    lbl2.setVisible(true);
    txt1.setVisible(true);
    txt2.setVisible(true);
    btnOk.setBounds(65, 80, 60, 20);
    lbl1.setBounds(5, 10, 50, 20);
    lbl2.setBounds(5, 40, 50, 20);
    txt1.setBounds(80, 10, 100, 20);
    txt2.setBounds(80, 40, 100, 20);
  }

  public void actionPerformed(ActionEvent e) {
  }

}
Диалог вызывается из подчиненной формы, а Owner - это ссылка на родительское окно

диалог отображается как мне нужно... но не модально

Если super(Owner, Caption); заменить на super(Owner, Caption, true); отображается модально, но нет ни текстовых полей, ни кнопок, можно изменять размер диалога и т.д.

Что не так?

Добавлено: 04 май 2006, 14:53
Oscar
keo,

keo писал(а):Конструктор требует чтобы Owner был либо Dialog либо Frame, а у меня JInternalFrame...
Во-первых, owner может быть и null.
Swing сам найдёт, что ему нужно.

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

new frmEditPeriodical&#40]

[quote="keo"]Что не так?[/quote]

[b]setVisible(true)] - должна быть [u]последняя[/u] операция в конструкторе!

[code]public frmEditPeriodical(JFrame Owner, String Caption, String Key,
                           String Mode) {
   super(Owner, Caption, true);
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    setBounds( (screenSize.width - 200) / 2, (screenSize.height - 130) / 2, 200,
              130);
    setResizable(false);
    contPane = this.getContentPane();
    contPane.setLayout(null);
    contPane.add(btnOk);
    contPane.add(lbl1);
    contPane.add(lbl2);
    contPane.add(txt1);
    contPane.add(txt2);
    btnOk.setVisible(true);
    lbl1.setVisible(true);
    lbl2.setVisible(true);
    txt1.setVisible(true);
    txt2.setVisible(true);
    btnOk.setBounds(65, 80, 60, 20);
    lbl1.setBounds(5, 10, 50, 20);
    lbl2.setBounds(5, 40, 50, 20);
    txt1.setBounds(80, 10, 100, 20);
    txt2.setBounds(80, 40, 100, 20);
    setVisible(true);
  }
Далее оффтопик:

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

btnOk.setVisible(true);
    lbl1.setVisible(true);
    lbl2.setVisible(true);
    txt1.setVisible(true);
    txt2.setVisible(true);
это всё нафик не нужно

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

contPane.setLayout(null);
очень не надёжная конструкция

Я бы сделал так:

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

public class FrmEditPeriodical extends JDialog implements ActionListener {

	private JTextField txt1, txt2;	

	public FrmEditPeriodical(JFrame owner, String caption, String key, String mode) {
		super(owner, caption, true);
		
		setLayout(new BorderLayout());
		
		JPanel panel = new JPanel();
		panel.setLayout(new GridLayout(2, 2));

		JButton btnOk = new JButton("OK");
		
		btnOk.addActionListener(this);

		txt1 = new JTextField();
		txt2 = new JTextField();
		
		panel.add(new JLabel("Datum"));
		panel.add(txt1);
		panel.add(new JLabel("Value"));
		panel.add(txt2);
		
		add(panel, BorderLayout.CENTER);
		
		add(btnOk, BorderLayout.SOUTH);
		
		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
		setLocation((screenSize.width - 200) / 2, (screenSize.height - 130) / 2);
		
		pack();
		
		setResizable(false);
		
		setVisible(true);
	}

	public void actionPerformed(ActionEvent e) {
		System.out.println(txt1.getText());
		System.out.println(txt2.getText());
		setVisible(false);
	}
}

Добавлено: 04 май 2006, 15:43
keo
Спасибо. Теперь все работает!
Еще вопрос. Если после завершения работы с диалогом закрывать его с помощью

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

setVisible(false);
он будет оставаться в памяти или сборщик мусора его уничтожит?