3

Swingコンポーネント(JButtonなど)をJPanelに追加すると、「推奨サイズ」でレンダリングされます。

ただし、実際の推奨サイズは、ペイントされたボタンよりも大きくなります。その周りに目に見えない境界線があるように見えます。

これが私のテストパネルの簡単なフレームです:

JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

TestPanel pnl = new TestPanel();
frame.getContentPane().add(pnl);

frame.pack();
frame.setVisible(true);

これが私のテストパネルです...

public class TestPanel extends JPanel {

    JButton btn1 = new JButton("Test1");
    JButton btn2 = new JButton("Test2");

    public TestPanel() {
        this.add(btn1);
        this.add(btn2);
    }

    public void paint(Graphics g) {
        super.paint(g);

        g.setColor(Color.RED);
        Dimension dim = btn1.getPreferredSize();
        g.drawRect(btn1.getX(), btn1.getY(), (int)(dim.getWidth()), (int)(dim.getHeight()));
    }

}

btn1の「PreferredSize」を赤でペイントして、preferredSizeが実際にはボタン自体よりも大きいことを示していることに注意してください。

ここに画像の説明を入力してください

私の質問は、JButtonのpreferredSizeではなく、ペイントされたボタンの幅と高さをどのように決定できるかということです。

どんな助けでも大歓迎です、ありがとう!

アップデート

すべてのSwingコンポーネントで実際にこれを機能させる必要があるため、より多くのコンポーネントを使用したスクリーンショットを次に示します。

残念ながら、これを理解する必要があります。表示されるウィジェットの「実際の」サイズを決定することは、私のアプリケーションにとって非常に重要です。

ここに画像の説明を入力してください

4

2 に答える 2

3

これは特別なことでも、実際に達成できることでもないと思います。

問題は、ボタンが「未ペイント」領域を使用して、フォーカスハイライトなどの他の要素をペイントしていることです。

あなたは見てみることができますAbstractButton#set/getMargin

于 2013-03-19T00:40:42.423 に答える
3

これ以上うまくいかない場合は、作成者が「コンポーネントをに配置し、境界線をにJPanel設定することをお勧めします」ことに注意してください。JPanel

補遺:以下のコメントに基づいて、あなたの質問が境界線のレンダリングではなく、コンポーネントの境界線の確立に関するものであることは明らかです。未使用のスペースとして認識されるものは、実際には、選択の強調表示や美的一貫性など、さまざまな用途のためにUIデリゲートによって予約されています。ここここの例でさまざまなルックアンドフィールテーマを選択することで、これがどのように変化するかを知ることができます。

使用getbounds()

画像

使用setBorder()

画像

import component.Laf;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Rectangle;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

/**
 * @see https://stackoverflow.com/a/15490187/230513
 */
public class Test {

    private void display() {
        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLayout(new FlowLayout());
        // https://stackoverflow.com/a/11949899/230513
        f.add(Laf.createToolBar(f));
        f.add(decorate(new JButton("Test")));
        f.add(decorate(new JTextField("Test")));
        f.add(decorate(new JTextArea(3, 8)));
        f.add(decorate(new JCheckBox("Test")));
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    private JPanel decorate(final JComponent c) {
        JPanel p = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                Rectangle r = c.getBounds();
                g.setColor(Color.red);
                // NB pen hangs down and to the right
                g.drawRect(r.x - 1, r.y - 1, r.width + 1, r.height + 1);
            }
        };
        p.add(c);
        return p;
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Test().display();
            }
        });
    }
}
于 2013-03-19T01:51:56.980 に答える