将onResizeListener添加到JButton

时间:2013-05-24 16:18:49

标签: java swing resize jframe jbutton

我有一个窗口(JFrame),其中包含特殊类型的JButtons(我自己的按钮类JButton)。该窗口假设在按钮大小改变时调整自身大小(例如,当我点击按钮时,它的字体大小增加,以及JButton的整个大小也是如此)。

我不希望make JFrame适合按钮,但让我决定窗口应该有多大,所以pack()无法解决。

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

enter image description here

代码示例(正常工作,点击按钮):

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

2 个答案:

答案 0 :(得分:2)

  

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

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

  

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

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

  

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

ComponentListenercomponentResized()个事件。所以你要将监听器添加到按钮。如果您的自动调整大小代码与使用pack()不同,则只能使用此方法。

答案 1 :(得分:1)

  • 请参阅ComponentListener

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

  • 如果事件只发生一次,如果调整大小结束,则添加Swing Timer

  • Swing Timer小dealy 350-500ms,如果调整大小仍然继续测试Timer.isRunning,如果返回true则只有Timer#restart()