为按钮添加边框使其变小
Adding border to button makes it smaller
当我为我的按钮添加边框时,按钮的尺寸缩小了。我正在使用以下行添加边框:
jButton.setBorder(BorderFactory.createLineBorder(Color.RED));
这是我的无边框按钮:
这是我的带边框按钮:
根据需要定义宽度和高度并执行以下代码行:
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);
一个简单的肮脏例子,说明为什么 setPreferredSize
是一个糟糕的想法以及为什么你应该尽可能避免它。
您还可以查看 Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in 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
并且它在相同的 PC 上工作 "ok" 运行 同样 OS,我们遇到了无数看似随机的问题,还有更多,甚至没有让我开始了解它在 Mac 上的表现OS。
But I'm only developing for Windows
重要的是,正如我所说,我们的应用程序在一些 Windows PC 上运行 "ok",但是一旦有人拥有自定义 DPI 或字体指标,或者他们升级到新版本Windows,它开始分崩离析 - 简答 - 不要使用 setPreferredSize
当我为我的按钮添加边框时,按钮的尺寸缩小了。我正在使用以下行添加边框:
jButton.setBorder(BorderFactory.createLineBorder(Color.RED));
这是我的无边框按钮:
这是我的带边框按钮:
根据需要定义宽度和高度并执行以下代码行:
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);
一个简单的肮脏例子,说明为什么 setPreferredSize
是一个糟糕的想法以及为什么你应该尽可能避免它。
您还可以查看 Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in 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
并且它在相同的 PC 上工作 "ok" 运行 同样 OS,我们遇到了无数看似随机的问题,还有更多,甚至没有让我开始了解它在 Mac 上的表现OS。
But I'm only developing for Windows
重要的是,正如我所说,我们的应用程序在一些 Windows PC 上运行 "ok",但是一旦有人拥有自定义 DPI 或字体指标,或者他们升级到新版本Windows,它开始分崩离析 - 简答 - 不要使用 setPreferredSize