0

我有一个 window( JFrame),其中包含特殊类型的JButtons(我自己的扩展按钮类JButton)。该窗口假设在按钮大小发生变化时会自行调整大小(例如,当我单击按钮时,它的字体大小会增加,JButton 的整个大小也会增加)。

我不想让JFrame按钮适合,但让我决定窗口应该有多大,所以pack()没有解决方案。

我正在考虑一种组件侦听器,它会在按钮大小更改时调整窗口大小,但我找不到任何东西。

在此处输入图像描述

代码示例(工作,单击按钮):

import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JOptionPane;

public class ResizingButton extends JButton {
    public ResizingButton(String txt) {
        super();
        setText(txt);
        addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) { 
                int newFontSize = getFont().getSize() + 1;
                setFont(new Font(Font.SANS_SERIF, Font.PLAIN, newFontSize));
                FontMetrics metrics = getFontMetrics(getFont());
                int width = metrics.stringWidth(getText());
                int height = metrics.getHeight();
                Dimension newDimension = new Dimension(width + 40, height + 10);
                setPreferredSize(newDimension);
                setBounds(new Rectangle(getLocation(), getPreferredSize()));
            }


    });
    }
}

import java.awt.FlowLayout;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;

@SuppressWarnings("serial")
public class Zadanie2 extends JFrame {
    JButton jb1, jb2;
    public Zadanie2() {
        createGUI();
    }

    private void createGUI() {
        setSize(200, 80);
        setLayout(new FlowLayout());

        add(new ResizingButton("tekst"));
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
    new Zadanie2();
    }
}
4

2 回答 2

2

该窗口假设在按钮大小发生变化时会自行调整大小(例如,当我单击按钮时,它的字体大小会增加,JButton 的整个大小也会增加)。

覆盖自定义按钮的 getPreferredSize()。

我不想让 JFrame 适合按钮,但让我决定窗口应该有多大,所以 pack() 不是解决方案。

现在,当您调用 pack() 时,框架将根据按钮的新首选大小调整大小。

我正在考虑一种组件侦听器,它会在按钮大小更改时调整窗口大小,但我找不到任何东西。

ComponentListener一个componentResized()事件。因此,您将侦听器添加到按钮。如果您的自动调整大小代码与仅使用 pack() 不同,您只会使用这种方法。

于 2013-05-24T16:27:08.600 回答
1
  • ComponentListener

  • ComponentListener调整大小时每一个像素触发一个事件

  • 如果调整大小结束,则将如果事件添加Swing Timer到 Swing GUI 将只执行一次

  • Swing Timer小delay 350-500ms,如果resize仍然继续然后测试Timer.isRunning,如果返回true那么只有Timer#restart()

于 2013-05-24T16:28:32.067 回答