Получить высоту строки заголовка JDialog?

#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.