Добавление границы к кнопке делает ее меньше

Когда я добавляю границу к моей кнопке, размер кнопки уменьшается. Я использую следующую строку, чтобы добавить границу:

jButton.setBorder(BorderFactory.createLineBorder(Color.RED));

Это моя кнопка без рамки:

Добавление границы к кнопке делает ее меньше

Это моя кнопка с рамкой:

Добавление границы к кнопке делает ее меньше

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
457
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Определите ширину и высоту в соответствии с вашими потребностями и выполните следующую строку кода:

jButton.setPreferredSize(new Dimension(width, height));

(1-) Это НЕ подходящее решение. Компоненты Swing предназначены для определения собственного предпочтительного размера на основе свойств компонента (шрифт, граница текста и т. д.).

camickr 24.08.2018 02:21

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

LineBorder border1 = new LineBorder(Color.red);
EmptyBorder border2 = new EmptyBorder(1,5,1,5);
Border newBorder = BorderFactory.createCompoundBorder(border1, border2);

ваше решение не работает, оно дает тот же результат, что и раньше

Muhammad Umer 23.08.2018 20:32

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

Muhammad Umer 23.08.2018 21:04

@MuhammadUmer На самом деле это не так (то же самое, что и установка предпочтительного размера) - измените текст динамически или измените шрифт, это решение адаптируется, другое - нет.

MadProgrammer 23.08.2018 22:15

Быстрый грязный пример того, почему setPreferredSize - ужасная идея и почему вам следует избегать его как можно чаще.

Вы также можете посмотреть Следует ли мне избегать использования методов set (Preferred | Maximum | Minimum) Size в Java Swing? для более подробного обсуждения этого вопроса.

NormalExaggerated

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            JButton goodButton = new JButton("Location 1");
            Insets insets = goodButton.getInsets();
            goodButton.setBorder(new CompoundBorder(
                            new LineBorder(Color.RED),
                            new EmptyBorder(insets)));
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            gbc.insets = new Insets(8, 8, 8, 8);
            add(goodButton, gbc);

            JButton badButton = new JButton("Location 2");
            badButton.setPreferredSize(new Dimension(110, 29));
            badButton.setBorder(new LineBorder(Color.RED));
            add(badButton, gbc);

            ActionListener listener = new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    goodButton.setText(random());
                    badButton.setText(random());

                    float size = rnd.nextInt(48) + 12;

                    Font f = goodButton.getFont().deriveFont(size);
                    goodButton.setFont(f);
                    badButton.setFont(f);
                }
            };

            goodButton.addActionListener(listener);
            badButton.addActionListener(listener);
        }

        private Random rnd = new Random();

        protected String random() {
            int length = rnd.nextInt(15) + 5;
            StringBuilder sb = new StringBuilder(length);
            for (int index = 0; index < length; index++) {
                sb.append((char)('A' + rnd.nextInt(26)));
            }
            return sb.toString();
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(600, 600);
        }

    }


}

Это несколько преувеличенный пример, но я, к сожалению, унаследовал проект, в котором предыдущий разработчик использовал setPreferredSize, и хотя он работал «нормально» на тех же ПК с той же ОС, у нас было бесчисленное количество, казалось бы, случайных проблем и множество больше и даже не заставляйте меня начинать с того, что он делал на MacOS.

But I'm only developing for Windows

Большое дело, как я уже сказал, у нас было приложение, работающее «нормально» на некоторых ПК с Windows, но как только у кого-то появились собственные параметры DPI или метрики шрифтов или они обновились до новой версии Windows, оно начало разваливаться - Краткий ответ - не используйте setPreferredSize

Другие вопросы по теме