JButton 缩放整个屏幕

JButton scale all the screen

我有以下代码

    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);

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

我做错了什么?

What am I doing wrong?

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

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

  • event dispatch thread.

  • 构建和操作 Swing GUI 对象

下面的示例添加了一个具有空边框的面板和一个填充以匹配的 GridLayout。对于这样的应用程序,还可以考虑 JToolBar for the buttons and 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 
 */
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);
    }
}
testbutton.setBounds(0, 0, 55, 55);
testbutton.setLocation(50, 50);

testbutton2.setBounds(55, 0, 44, 44);
testbutton2.setLocation(50, 100);

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

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

BorderLayout 希望您在将组件添加到框架时提供 "constraint"。如果您不提供约束,则使用 "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);