【问题标题】:Scala swing all button same widthScala摆动所有按钮的宽度相同
【发布时间】:2015-12-24 06:44:09
【问题描述】:

我的 scala swing 应用程序中有一个 BoxPanel 按钮,这对我来说看起来很丑,因为这些按钮的大小都不同。我已将其更改为 GridPanel,但随后它们也垂直填充了面板,我发现它更丑陋。如何让所有按钮填充 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
  }
}

有没有办法使上述变通办法起作用或不是一种变通办法?

【问题讨论】:

    标签: swing scala layout


    【解决方案1】:

    Box Layout Features 中讨论过,“如果所有组件都具有相同的 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);
        }
    }
    

    【讨论】:

      【解决方案2】:

      TrashGod 是对的,但我想我会发布一个翻译成 Scala 的答案,因为他是用 Java 编写的。多亏阅读了trashgod的回答,我将preferredSize 替换为maximumSize,从而使我原来的解决方法生效。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-07
        • 2014-05-18
        • 2012-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-06
        相关资源
        最近更新 更多