我遇到了这个奇怪的问题,似乎并没有在Mac系统上发生,而是在Windows上发生。我正在使用这个GUI,我正在尝试使所有按钮长度相同(最长按钮的长度)但由于某些原因在Windows上,其中一个按钮将不会显示整个字符串并将其截断为省略号(...)。
以下是我用来检查和设置最长按钮标签的方法:
//Temp button to hold the longest button for resizing
JButton longestButton = new JButton();
//Find size of the largest of the 6 buttons
for(int i = 0; i < 6; i++){
if (buttons[i].getText().length() > longestButton.getText().length()){
longestButton = buttons[i];
}
}
//Match size of 6 hex buttons to the size of the longest one
for(int i = 0; i < 6; i++){
buttons[i].setPreferredSize(longestButton.getPreferredSize());
}
有人对此有所了解吗?
答案 0 :(得分:3)
如果您真的要覆盖setPreferredSize()
,请不要使用getPreferredSize()
。 BoxLayout
适用于此:“对于从上到下的方框布局,容器的首选宽度是子容器的最大首选宽度。”在下面的示例中,BorderLayout.LINE_END
采用容器的首选宽度。每个按钮都会覆盖getMaximumSize()
以有效删除按钮宽度的上限。结果适用于各个平台。
import java.awt.*;
import javax.swing.*;
/**
* @see https://stackoverflow.com/a/20085489/230513
*/
public class TestViewer {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new ButtonPanel(), BorderLayout.LINE_END);
frame.pack();
frame.setSize(500, 300);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
private static class ButtonPanel extends Box {
public ButtonPanel() {
super(BoxLayout.Y_AXIS);
this.add(createButton("Button 1"));
this.add(createButton("Button 2"));
this.add(createButton("Long Button 3"));
this.add(createButton("Button 4"));
this.add(createButton("Button 5"));
}
private JButton createButton(String name) {
final JButton b = new JButton(name) {
@Override
public Dimension getMaximumSize() {
return new Dimension(
Short.MAX_VALUE, getPreferredSize().height);
}
};
b.setAlignmentX(0.5f);
return b;
}
}
}
答案 1 :(得分:0)
您可以找到最宽的preferredSize()按钮,而不是找到最大的.getText()。length()按钮。
for(int i = 0; i < 6; i++){
if (buttons[i].getPreferredSize().getWidth() > longestButton.getPreferredSize().getWidth()){
longestButton = buttons[i];
}
}
这解决了评论中提到的问题vandale