【问题标题】:Resizing a frame when clicking a button单击按钮时调整框架大小
【发布时间】:2017-05-06 19:53:48
【问题描述】:

我最近开始学习 Java 课程来熟悉编程。很抱歉,如果这似乎是一个愚蠢的问题。我要做的是在单击按钮时调整窗口大小。

代码说的比文字多:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class GrowShrink extends JFrame implements ActionListener {
    public GrowShrink(String title) throws HeadlessException {
        super(title);

        setLayout(new GridBagLayout());
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JButton buttonGrow = new JButton("Grow");
        JButton buttonShrink = new JButton("Shrink");
        buttonGrow.addActionListener(this);
        buttonShrink.addActionListener(this);
        add(buttonGrow);
        add(buttonShrink);
        pack();
        setSize(300, 300);
        setLocationRelativeTo(null);
        setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals("Grow")) {
            getContentPane().setSize(600, 600);
            getContentPane().doLayout();
//            getContentPane().repaint();
        } else if (e.getActionCommand().equals("Shrink")) {
            getContentPane().setSize(200, 200);
//            getContentPane().revalidate();
            repaint();
        }
    }

    public static void main(String[] args) {
        GrowShrink growShrink = new GrowShrink("Grow and Shrink the frame");
    }
}

当我跟踪 IntelliJ 的调试器时,我可以清楚地看到,在单击按钮 Grow 后检查 hightwidth 时,大小已变为 600x600。但是,这似乎对窗口没有任何作用。

我在这里遗漏了什么吗?我试过repaint()doLayout()revalidate(),但没有成功。

【问题讨论】:

  • ifelse 块内,你应该调用GrowShrink.this.setSize(...);GrowShrink.this.repaint();

标签: java swing intellij-idea jframe


【解决方案1】:

我要做的是在单击按钮时调整窗口大小。

您的代码正在设置内容窗格的大小,而不是框架。所以你需要在框架上调用setSize(...)

我在这里遗漏了什么吗?我尝试过 repaint()、doLayout() 和 revalidate(),但没有成功。

Swing 使用布局管理器。布局管理器负责根据组件的“首选”大小和添加到面板的组件来设置组件的大小和位置。

调用revalidate() 将调用布局管理器,但不会发生任何变化,因为添加到面板的组件的首选大小没有改变。

如果在您执行 revalidate() 时内容窗格的首选大小确实发生了变化,那么您仍需要在框架上调用 pack() 以利用重新计算的首选大小。

【讨论】:

  • 谢谢,我只是不知道 JPane 和 JFrame 之间的区别。多亏了你的解释和@Naruto 的代码,这点现在很清楚了。
猜你喜欢
  • 2015-02-11
  • 2016-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-23
  • 2013-02-11
  • 1970-01-01
相关资源
最近更新 更多