【问题标题】:Change button size FlowLayout更改按钮大小 FlowLayout
【发布时间】:2014-01-03 02:33:44
【问题描述】:

我正在尝试更改按钮大小,但是当我设置宽度时,即使高度有自己的值,高度也会自动更改。如何仅更改宽度(或高度)?我的“重置”和“计算”按钮需要这个。 代码(没有不必要的其他代码)

class Wind extends JButton {
//declaration of variables
@Override
public Dimension getPreferredSize() {
    Dimension d = super.getPreferredSize();
    int s = (int) (d.getWidth() < d.getHeight() ? d.getHeight() : d.getWidth());
    return new Dimension(s, s);
}
public static void main(final String[] args) {
    Runnable r = new Runnable() {

        @Override
        public void run() {

            JComponent gui = new JPanel(new FlowLayout());

            for (int ii = 1; ii < 20; ii++) {
                final  JButton button = new Wind("");

                gui.add(button);
                button.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                    }

                });

            }

            gui.setBorder(new EmptyBorder(4, 3, 4, 8));
            final JButton reset = new Wind("Reset");
            Dimension dim = new Dimension(40,80);

            reset.setPreferredSize(dim);

            gui.add(reset);

            reset.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {

                }

            });

            JFrame f = new JFrame("Name of my frame");
            f.add(gui);

            final JButton cal = new Wind("Calc");

            gui.add(cal);
            cal.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {    }
            });

            f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            f.setLocationByPlatform(true);
            f.pack();
            f.setVisible(true);
            f.setSize(350, 450);
            f.setResizable(false);
        }
    };
    SwingUtilities.invokeLater(r);
}

}

【问题讨论】:

  • 为什么你的JButtonnew Window
  • 这与任何上下文无关。发布完整的工作/运行代码。

标签: java swing jbutton flowlayout


【解决方案1】:

好吧,据我所知,您强制 Wind 实例的宽度和高度具有相同的值:

@Override
public Dimension getPreferredSize() {
    Dimension d = super.getPreferredSize();
    int s = (int) (d.getWidth() < d.getHeight() ? d.getHeight() : d.getWidth());
    return new Dimension(s, s);
}

Wind#getPreferredSize 返回一个 Dimension 实例,该实例包含您的 Wind 实例想要拥有的宽度和高度。在您的情况下,它会返回一个新的 Dimension 实例,该实例由两个相同的值组成:s,这是您通过 Wind#setPreferredSize 设置的最大宽度和高度。你可能想按照@Elliott Frisch 刚刚建议的那样做:)

顺便说一句,你也在接近尾声:

frame.pack()
...
frame.setSize(...);

在我看来,你应该做一个或另一个,但调用这两种方法没有意义:)

【讨论】:

    【解决方案2】:

    因为你的getPreferredSize() 方法 -

    // sets s to the least of height and width.
    int s = (int) (d.getWidth() < d.getHeight() ? d.getHeight() : d.getWidth());
    return new Dimension(s, s); // <-- sets height and width the same.
    

    我认为你想使用(取决于你的目标) -

    if (d.getWidth() < d.getHeight()) {
      return new Dimension(d.getWidth(), d.getHeight());
    }
    return new Dimension(d.getHeight(), d.getWidth()); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-04
      • 2011-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-21
      • 1970-01-01
      • 2019-01-18
      相关资源
      最近更新 更多