【问题标题】:JButton scale all the screenJButton 缩放整个屏幕
【发布时间】:2016-05-21 18:34:47
【问题描述】:

我有以下代码

    JFrame frame = new JFrame("Organizer");
    frame.setBounds(100, 100, 700, 700);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);


    JButton testbutton = new JButton("testbutton");
    testbutton.setBounds(0, 0, 55, 55);

    JButton testbutton2 = new JButton("tdestbutton2");
    testbutton2.setBounds(55, 0, 44, 44);

    frame.add(testbutton2);
    frame.add(testbutton);

结果有时是正确的,有时是这样

我做错了什么?

【问题讨论】:

    标签: java eclipse swing java-8 jbutton


    【解决方案1】:

    我做错了什么?

    • 不要使用setBounds();请使用layout manager

    • 向封闭容器添加组件后调用setVisible()

    • event dispatch thread 上构造和操作 Swing GUI 对象。

    下面的示例添加了一个面板,该面板具有一个空边框和一个填充以匹配的GridLayout。对于这样的应用程序,还可以考虑将JToolBar 用于按钮,将CardLayout 用于工作屏幕。

    import java.awt.BorderLayout;
    import java.awt.EventQueue;
    import java.awt.GridLayout;
    import javax.swing.BorderFactory;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    /**
     * @see http://stackoverflow.com/a/37366846/230513
     */
    public class Test {
    
        private static final int PAD = 50;
    
        private void display() {
            JFrame f = new JFrame("Test");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            JPanel p = new JPanel(new GridLayout(0, 1, PAD, PAD));
            p.setBorder(BorderFactory.createEmptyBorder(PAD, PAD, PAD, PAD));
            p.add(new JButton("Test Button 1"));
            p.add(new JButton("Test Button 2"));
            f.add(p, BorderLayout.CENTER);
            f.pack();
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Test()::display);
        }
    }
    

    【讨论】:

    • 你认为哪个 UI 库更好?
    • @dios231:断章取意,很难说;为了跨平台的便利,我几乎总是更喜欢可用的 Java 风格(2D、AWT、SWT、Swing、FX)。
    【解决方案2】:
    testbutton.setBounds(0, 0, 55, 55);
    testbutton.setLocation(50, 50);
    
    testbutton2.setBounds(55, 0, 44, 44);
    testbutton2.setLocation(50, 100);
    

    摆脱那些声明,因为那样什么都不做。

    它们什么都不做,因为 JFrame 的内容窗格的默认布局管理器是 BorderLayoutBorderLayout 将重置每个组件的大小/位置。

    BorderLayout 期望您在将组件添加到框架时提供“约束”。如果您不提供约束,则使用“CENTER”。 “CENTER”中只能添加一个组件,因此只会显示最后添加的按钮。

    了解使用BorderLayout 的基本概念的简单解决方案是使用:

    //frame.add(testbutton2);
    //frame.add(testbutton);
    frame.add(testbutton2, BorderLayout.PAGE_START);
    frame.add(testbutton, BorderLayout.PAGE_END);
    

    这将在两行上显示按钮。

    阅读Layout Managers 上的 Swing 教程以获取更多信息和示例。下载演示代码并修改该代码将遵循 Swing 约定。

    例如,您需要在使框架可见之前将组件添加到框架中。所以代码的顺序应该是:

    frame.add(...);
    frame.add(...);
    frame.pack();
    frame.setVisible(true);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-19
      • 2012-10-22
      相关资源
      最近更新 更多