【问题标题】:FlowLayout alignment changes are not directly visible in SwingFlowLayout 对齐方式的变化在 Swing 中不直接可见
【发布时间】:2026-01-13 20:35:01
【问题描述】:

当我更改当前在 SWING 中可见的组件的布局管理器的属性时,更改不可见。如果我调整整个框架的大小,更改就会变得可见。

如何解决这个问题?我已经尝试过revalidate() 和朋友,但没有任何成功。在更改布局属性的行(mgr.setAlignment(align);)之后的LayoutFun.this.revalidate(); 也无济于事。

简短的自我解释示例 - 当您按下按钮时,它的对齐方式应该会改变。相反,没有任何反应(在我的计算机上),只有当我调整整个框架的大小时,更改才会可见

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;

public class LayoutFun extends JFrame {

    public LayoutFun() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final FlowLayout mgr = new FlowLayout(FlowLayout.CENTER);
        setLayout(mgr);
        add(new JButton(new AbstractAction("Other alignment") {

            @Override
            public void actionPerformed(ActionEvent e) {
                int align = mgr.getAlignment();
                switch (align) {
                    case FlowLayout.CENTER:
                        align = FlowLayout.LEFT;
                        break;
                    case FlowLayout.LEFT:
                        align = FlowLayout.RIGHT;
                        break;
                    default:
                    case FlowLayout.RIGHT:
                        align = FlowLayout.CENTER;
                        break;
                }
                mgr.setAlignment(align);
            }
        }));
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                LayoutFun lst = new LayoutFun();
                lst.setVisible(true);
                lst.setSize(600, 400);
            }
        });
    }
}

【问题讨论】:

    标签: java swing layout-manager flowlayout


    【解决方案1】:

    验证并重新绘制框架的可见部分,即ContentPane

    getContentPane().revalidate();
    getContentPane().repaint();
    

    【讨论】:

    • 这行得通。惊人的。但是当我不直接在 JFrame 中时怎么办。假设我得到一个Container 并在容器上调用((FlowLayout) container).setAlignment(align);getContentPane() 不退出。
    • 在我的应用程序中并不那么简单。但无论如何,你的回答可能会有所帮助。
    • 也有 repaint(),但在大多数情况下都成功
    • @mythbu (re)validate with repaint 是已经可见的 Swing GUI 中 LayoutManagers 的通知器,
    • 我终于通过一些铸造得到了它,并且只使用了getContentPane().revalidate();。谢谢!
    最近更新 更多