



Определите ширину и высоту в соответствии с вашими потребностями и выполните следующую строку кода:
jButton.setPreferredSize(new Dimension(width, height));
Если вы хотите добавить границу, а также хотите иметь поле между текстом метки и краем границы, создайте составную границу с пустой рамкой внутри (с правильным размером для поля) и не устанавливайте предпочтительный размер. Это позволит кнопке изменить свой размер независимо от текста и шрифта метки. Например:
LineBorder border1 = new LineBorder(Color.red);
EmptyBorder border2 = new EmptyBorder(1,5,1,5);
Border newBorder = BorderFactory.createCompoundBorder(border1, border2);
ваше решение не работает, оно дает тот же результат, что и раньше
Эй, он все еще дает маленькую кнопку, и мне нужно отредактировать вставки для пустой границы, чтобы получить большую кнопку, что то же самое, что и установка предпочтительного размера. В любом случае спасибо
@MuhammadUmer На самом деле это не так (то же самое, что и установка предпочтительного размера) - измените текст динамически или измените шрифт, это решение адаптируется, другое - нет.
Быстрый грязный пример того, почему setPreferredSize - ужасная идея и почему вам следует избегать его как можно чаще.
Вы также можете посмотреть Следует ли мне избегать использования методов set (Preferred | Maximum | Minimum) Size в Java Swing? для более подробного обсуждения этого вопроса.
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
(1-) Это НЕ подходящее решение. Компоненты Swing предназначены для определения собственного предпочтительного размера на основе свойств компонента (шрифт, граница текста и т. д.).