【问题标题】:Can you maintain the position of objects on a Java Swing panel?你能在 Java Swing 面板上保持对象的位置吗?
【发布时间】:2009-05-15 18:30:16
【问题描述】:

我目前正在使用 Java Swing 设计一个计算器面板。但是,将所有按钮排成一行是一件极其痛苦的事情,因为每当我添加新按钮或更改按钮大小时,它们总是会调整自己的大小和重新定位。

是否有某种布局或可以将按钮“锁定”到位,以便在我移动/调整大小/添加其他按钮时不受影响?

谢谢, 鲍勃

【问题讨论】:

  • 网格布局?网格包布局?我不确定我是否完全理解这个问题;按钮如何移动和改变大小?

标签: java swing


【解决方案1】:

扩展汤姆所说的话......

要让组件变得不可见但保持其位置,您可以将它与空标签一起放置在 CardLayout 中,然后交换可见的。

您可以按如下方式创建一个类来为您执行此操作。主要只是显示一个示例,如果您单击一个按钮,它会在保留其位置的同时被删除。我输入了 showComponent/hideComponent 和 setVisible(t/f) - 取决于你喜欢的风格。

这可能无法完全满足您的需求,但可能对您的应用程序的一部分有用。

public class Placeholder extends JPanel {
    private static final long serialVersionUID = 1L;
    private CardLayout cardLayout_;
    public Placeholder(JComponent component) {
        cardLayout_ = new CardLayout();
        setLayout(cardLayout_);
        add(component, "visible"); // the component
        add(new JLabel(), "hidden"); // empty label
    }
    public void showComponent() {
        cardLayout_.show(this, "visible"); 
    }
    public void hideComponent() {
        cardLayout_.show(this, "hidden"); 
    }
    public void setComponentVisible(boolean visible) {
        if (visible)
            showComponent();
        else
            hideComponent();
    }
    public static void main(String[] args) {
        JFrame f = new JFrame();
        f.setLayout(new GridLayout(2,0));
        for (int n = 1; n < 10; n++) {
            JButton b = new JButton(n + "");
            final Placeholder placeholder = new Placeholder(b);
            f.add(placeholder);
            b.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    placeholder.hideComponent();
                }
            });
        }
        f.pack();
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        f.setVisible(true);
    }
}

【讨论】:

  • 这行得通!如何使 JLabel 透明,以便在隐藏组件时不显示任何内容?
  • 忽略我的问题,占位符的背景不透明:)
【解决方案2】:

我建议您更改其可见性属性(setVisible),而不是添加和删除按钮。一些布局管理器会忽略不可见的组件,因此您可能需要在与原始组件的首选/最小/最大尺寸相同的位置添加一个非 opqaue(或匹配的背景)组件。更简单的你可能想使用OverlayLayout

【讨论】:

    【解决方案3】:

    您可以使用 GridBagLayout 将它们保持在网格中,但允许它们调整大小

    【讨论】:

      【解决方案4】:

      扩展其他人所说的话......

      除了使组件不可见之外,您还可以禁用它们...
      当然,这取决于您的应用程序和您的偏好。

      除了上面提到的布局,还有一些免费的,比如 TableLayout 和通用的 MigLayout。

      【讨论】:

        【解决方案5】:

        这可能取决于您使用的开发环境。

        在 Netbeans 中,您可以右键单击控件容器(窗体/面板)并从多个布局选项中进行选择。 'Absolute Layout' 将允许您定位控件而不自动调整它们的大小,尽管它不会让您将控件放在彼此之上。

        【讨论】:

          【解决方案6】:

          我建议你检查A Visual Guide to Layout Managers。根据您想要的外观和功能,有不同的布局可能适合您。如果主要问题是调整大小操作(我假设是父 JFrame o JPanel),Spring Layout 允许您建立关于组件相对位置的约束。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多