Получить высоту строки заголовка JDialog? - PullRequest
1 голос
/ 01 ноября 2011

Как я могу получить высоту JDialog строки заголовка?

Я пробовал с getInsets().top, но он возвращает 0.

Ответы [ 4 ]

1 голос
/ 01 ноября 2011

Я не знаю, если, если вы используете собственный оконный менеджер ОС, это может быть невозможно. Причина в том, что строка заголовка рисуется вне Java. Если вам действительно нужна эта информация, вам, вероятно, понадобится использовать JNI.

Однако, если вы используете внутренние рамки, вы можете сделать следующее

JInternalFrame mydialog = new JInternalFrame();
((BasicInternalFrameUI)mydialog.getUI()).getNorthPane().getHeight();

Но более важный вопрос: почему вы хотите знать? Идея оконной системы заключается в том, что программист может абстрагировать содержимое своего приложения от оконной среды. Это сделано для того, чтобы пользователь мог динамически настраивать внешний вид окон, выглядеть одинаково во всех приложениях и не мешать нормальной работе приложения.

Такой интерфейс между ОС и приложением потребовал бы всего API для передачи сообщений, чтобы информировать о смене декораций окон и т. Д.

0 голосов
/ 04 сентября 2015

Чтобы получить вставки, вам нужно убедиться, что ваш JDialog виден.если вы попытаетесь получить его перед отображением на экране, вы получите 0.

0 голосов
/ 01 ноября 2011

kofucii, вы на правильном пути - используйте dialog getInsets().top, как вы делали в своем примере.Я думаю, вы получили 0, вероятно, потому что объект JDialog был невидимым.В противном случае верхнее значение должно быть ~ 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

В STDOUT я получаю:

36
9
0 голосов
/ 01 ноября 2011

Попробуйте:

Container c = this.getContentPane();
Point pt = c.getLocation();
pt = SwingUtilities.convertPoint(c, pt, this);

Переменная pt теперь содержит расположение области содержимого относительно источника JDialog. Следовательно, pt.x - это расстояние от левого края, а pt.y - это расстояние от вершины.

Предостережения:

  • Это предполагает отсутствие JMenuBar. Если он у вас есть, используйте вместо него местоположение JMenuBar.
  • Это будет включать в себя любые границы, добавленные в область содержимого или в слой слоя. Вам нужно вычесть это.
...