#java #swing #jdialog
#java #качать #jdialog
Вопрос:
Как я могу получить высоту JDialog
строки заголовка?
Я пробовал getInsets().top
, но он возвращается 0
.
Комментарии:
1. Вы делали это в видимом или упакованном диалоговом окне?
2. и с помощью
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
3. @camickr, да, это видно. С упакованным также нет никакой разницы.
4. Для меня работает нормально. Опубликуйте свой SSCCE, который демонстрирует проблему. Мой SSCCE состоял из 3 строк кода. Один для создания диалогового окна, один для его отображения и третий для печати вставок.
5. «Как я могу получить высоту строки заголовка JDialog?» Почему вы (думаете, что вам) нужно знать?
Ответ №1:
Попробуйте:
Container c = this.getContentPane();
Point pt = c.getLocation();
pt = SwingUtilities.convertPoint(c, pt, this);
pt
Переменная теперь содержит местоположение области содержимого относительно источника JDialog. Следовательно, pt.x
это расстояние от левого края и pt.y
расстояние от вершины.
Предостережения:
- Это предполагает отсутствие JMenuBar. Если она у вас есть, используйте вместо нее расположение строки JMenuBar.
- Это будет включать любые границы, добавленные к ContentPane или layerdPane. Вам нужно будет вычесть их.
Комментарии:
1. Это сработало бы, если в постере используется «оформленный» диалог или LAF, который рисует саму строку заголовка. В противном случае этого следует избегать.
Ответ №2:
Я не знаю, если вы используете собственный оконный менеджер ОС, это может быть невозможно. Причина в том, что строка заголовка отображается вне Java. Если вам действительно нужна эта информация, вам, вероятно, потребуется использовать JNI.
Однако, если вы используете внутренние фреймы, вы можете сделать следующее
JInternalFrame mydialog = new JInternalFrame();
((BasicInternalFrameUI)mydialog.getUI()).getNorthPane().getHeight();
Но более важный вопрос: почему вы хотите знать? Идея оконной системы заключается в том, чтобы программист мог абстрагировать содержимое своего приложения от оконной среды. Это делается для того, чтобы внешний вид окна мог динамически настраиваться пользователем, выглядеть однородным во всех приложениях и не мешать нормальной работе приложения.
Для такого интерфейса между ОС и приложением потребуется целый API для передачи сообщений для информирования о смене оформления окон и т. Д.
Комментарии:
1. Возможно, вы захотите узнать это, если кто-то (например, ваш босс) потребует, чтобы открытые внутренние фреймы были правильно выровнены.
Ответ №3:
kofucii, вы на правильном пути — используйте dialog getInsets().top
, как вы делали в своем примере. Я думаю, вы получили 0, вероятно, потому, что объект JDialog был невидимым. В противном случае значение ‘top’ должно быть ~ 36 …
Вот единичный случай:
package dejan.various;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
/**
*
* @author dejan
*/
public class TestDialog extends JDialog implements ActionListener {
private javax.swing.JButton testButton;
public TestDialog() {
setPreferredSize(new Dimension(640,480));
getContentPane().setLayout(new BorderLayout());
testButton = new JButton("Click me");
testButton.addActionListener(this);
getContentPane().add(testButton, BorderLayout.SOUTH);
pack();
}
@Override
public void actionPerformed(ActionEvent e) {
Insets insets = this.getInsets();
System.out.println(insets.top);
System.out.println(insets.left);
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new TestDialog().setVisible(true);
}
});
}
} // TestDialog class
В стандартном выводе я получаю:
36
9
Ответ №4:
Чтобы получить вставки, вам нужно убедиться, что ваш JDialog виден. если вы попытаетесь получить его перед отображением на экране, вы получите 0.