0

JFrame私は特別なタイプのJButtons(拡張するボタンの私自身のクラス)を含むwindow()を持っています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

1
  • 見るComponentListener

  • ComponentListenerサイズ変更時に 1 ピクセルごとに 1 つのイベントを発生させる

  • Swing Timerサイズ変更が終了した場合、Swing GUI への if イベントが 1 回だけ実行されるように追加します。

  • Swing Timerわずか 350 ~ 500 ミリ秒で、サイズ変更がまだ続く場合はテストを続行し、Timer.isRunningtrue を返す場合のみTimer#restart()

于 2013-05-24T16:28:32.067 に答える