Scala swing所有按钮宽度相同
在我的scala swing应用程序中,我有一个盒子面板上的按钮,在我看来很难看,因为这些按钮大小都不一样。我把它改成了网格面板,但是他们也垂直填充了面板,我觉得更难看。我怎样才能让所有的按钮都填满BoxPanel的宽度,但保持其最佳高度 我尝试了一种变通方法,如下所示,面板将所有内容设置为最大宽度,但没有效果Scala swing所有按钮宽度相同,swing,scala,layout,Swing,Scala,Layout,在我的scala swing应用程序中,我有一个盒子面板上的按钮,在我看来很难看,因为这些按钮大小都不一样。我把它改成了网格面板,但是他们也垂直填充了面板,我觉得更难看。我怎样才能让所有的按钮都填满BoxPanel的宽度,但保持其最佳高度 我尝试了一种变通方法,如下所示,面板将所有内容设置为最大宽度,但没有效果 val buttons = new BoxPanel(Orientation.Vertical) { contents += new Button("Normal Button")
val buttons = new BoxPanel(Orientation.Vertical) {
contents += new Button("Normal Button")
contents += new Button("small")
contents += new Button("Significantly larger button than the rest")
val maxWidth = contents map {
(button: Component) => button.preferredSize
} maxBy { _.width }
contents foreach {
(button: Component) => button.preferredSize = maxWidth
}
}
是否有一种方法可以使上述解决方案起作用或不是解决方案?在“如果所有组件都具有相同的X对齐方式,则所有组件都与容器一样宽”中讨论。覆盖按钮的getMaximumSize()
实现如下所示,返回任意宽度和按钮的首选高度。更改setHorizontalAlignment()
和/或调整框架大小以查看效果
@Override
public Dimension getMaximumSize() {
return new Dimension(
Short.MAX_VALUE, getPreferredSize().height);
}
代码如下所示:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
/** @see http://stackoverflow.com/a/34443937/230513 */
public class ButtonBoxTest {
private void display() {
JFrame f = new JFrame("Test");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new JPanel() { //arbitrary filler
@Override
public Dimension getPreferredSize() {
return new Dimension(320, 240);
}
});
f.add(createButtonPanel(), BorderLayout.EAST);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
private JPanel createButtonPanel() {
JPanel btnPanel = new JPanel();
btnPanel.setLayout(new BoxLayout(btnPanel, BoxLayout.Y_AXIS));
btnPanel.add(createButton("Button 1"));
btnPanel.add(createButton("Button 2"));
btnPanel.add(createButton("Long Button 3"));
btnPanel.add(createButton("Button 4"));
btnPanel.add(createButton("Button 5"));
return btnPanel;
}
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);
b.setHorizontalAlignment(JButton.RIGHT);
return b;
}
public static void main(String[] args) {
EventQueue.invokeLater(new ButtonBoxTest()::display);
}
}
垃圾神是对的,但我想我会把答案翻译成Scala,因为他的答案是Java。多亏阅读了垃圾神的回答,我用
maximumSize
替换了preferredSize
,从而获得了我最初的解决方案
val buttons = new BoxPanel(Orientation.Vertical) {
contents += new Button("Normal Button")
contents += new Button("small")
contents += new Button("Significantly larger button than the rest")
val maxWidth = contents map {
(button: Component) => button.maximumSize
} maxBy { _.width }
contents foreach {
(button: Component) => button.maximumSize = maxWidth
}
}
我也能从垃圾神的答案中得到一个解决方案,只需
private def equalButtons(name: String): Button = {
new Button(name) {
maximumSize = new Dimension(Short.MaxValue, maximumSize.height)
}
}
val buttons = new BoxPanel(Orientation.Vertical) {
contents += new equalButtons("Normal Button")
contents += new equalButtons("small")
contents += new equalButtons("Significantly larger button than the rest")
}