Scala swing所有按钮宽度相同

Scala swing所有按钮宽度相同,swing,scala,layout,Swing,Scala,Layout,在我的scala swing应用程序中,我有一个盒子面板上的按钮,在我看来很难看,因为这些按钮大小都不一样。我把它改成了网格面板,但是他们也垂直填充了面板,我觉得更难看。我怎样才能让所有的按钮都填满BoxPanel的宽度,但保持其最佳高度 我尝试了一种变通方法,如下所示,面板将所有内容设置为最大宽度,但没有效果 val buttons = new BoxPanel(Orientation.Vertical) { contents += new Button("Normal Button")

在我的scala swing应用程序中,我有一个盒子面板上的按钮,在我看来很难看,因为这些按钮大小都不一样。我把它改成了网格面板,但是他们也垂直填充了面板,我觉得更难看。我怎样才能让所有的按钮都填满BoxPanel的宽度,但保持其最佳高度

我尝试了一种变通方法,如下所示,面板将所有内容设置为最大宽度,但没有效果

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")
}