Нужна помощь в понимании значения, возвращаемого методом getInsets () JButton - PullRequest
0 голосов
/ 20 февраля 2019

Мне трудно понять значение, возвращаемое методом getInsets () JButton.Читая документацию, я понял, что метод getInsets () возвращает вставки границы кнопки (если на кнопке установлена ​​граница), которая определяет объем пространства, которое должна нарисовать сама граница.

Однако при выполнении следующего кода:

import java.awt.Insets;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ButtonMarginInsets {   
    public static void main(String args[]) {
        JFrame frame = new JFrame();
        frame.setTitle("Test Frame");        
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        JPanel contentPane = new JPanel();

        JButton button = new JButton();
        button.setText("Test Button");       
        System.out.println("Button Border Insets " + button.getBorder().getBorderInsets(button));        
        button.setMargin(new Insets(100, 10, 10, 10));       
        System.out.println("Button Insets " + button.getInsets());       

        contentPane.add(button);

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setVisible(true);
    } 
}

я получаю следующий вывод консоли:

Вставки границ кнопок java.awt.Insets [top = 5, left =17, нижний = 5, правый = 17]

Вставки кнопок java.awt.Insets [верхний = 103, левый = 13, нижний = 13, правый = 13]

иследующий кадр: Изображение кадра

Мои вопросы:

  1. Как верхнее, левое, нижнее и правое значения определяют количество пространства, необходимое границеНарисуй сам?
  2. Почему эти вставки меняются при установке поля?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Хорошо, обо всем по порядку.Ваши звонки на button.getInsets() и getBorderInsets(button) идентичны , как вы видели в документации, и подтверждаются источником (внутренне, getInsets() просто звонит getBorderInsets(this)в любом случае).

Теперь, когда это не так, по умолчанию JButton украшен CompoundBorder .Если вы посмотрите на источник , то увидите, что CompoundBorder, используемый для кнопок, состоит из:

  • внешняя граница типа BasicBorders.ButtonBorder и
  • внутри границы типа MarginBorder.

MarginBorder, вероятно, представляет интерес для вас здесь.У него есть переопределение для getBorderInsets() , которое возвращает поля компонента .

Итак, в заключение, граница JButton фактически составлена ​​из ДВУХ границ.Фактические ограничивающие линии снаружи (которые вы обычно рассматривали бы как «границу», заставляя ее выглядеть трехмерной), плюс граница поля внутри.Поэтому, когда вы делаете setMargin(), вы также воздействуете на внутри части вашей составной границы.

Это объясняет ваш результат:

Вставки кнопокjava.awt.Insets [верх = = 1044 * 103 , слева = 13 , снизу = 13 , справа = 13 ]

Внешние линии имеют ширину 3 px, каждая, а ваше поле ( 100,10,10,10 ) дает указанную выше общую вставку границы.

0 голосов
/ 20 февраля 2019

Я думаю, что вы делаете это с помощью вставок компонентов.Поэтому назовите что-то вроде:

Insets insets = component.getInsets();
insets.set(top, left, bottom, right);

Это следует сделать после установки границы для компонента.

Insets - это простой класс, который содержит 4 поля: top, left,снизу и справа.Вставки используются для описания заполнения, окружающего компонент.Ожидается, что каждая граница в Swing будет возвращать объект Insets, описывающий, сколько отступов добавить к компоненту, чтобы Border отображал правильно.

Разработка пользовательских компонентов Swing Совет: Insets Matter

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...