-1

私はこの内部クラスを持っています:

private class Plats extends JComponent{
    private String namn;
    Plats(int x, int y, String n){
        namn=n;
        setBounds(x-10, y-10, 150, 40);
        setPreferredSize(new Dimension(20, 20));
        setMinimumSize(new Dimension(20, 20));
        setMaximumSize(new Dimension(20, 20));
    }
    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        g.setColor(Color.BLUE);
        g.fillOval(0, 0, 20, 20);
        g.setColor(Color.BLACK);
        g.setFont(font);
        g.drawString(namn, 0, 34);
    }
    public boolean contains(int x, int y){
        return x<20 && x>0 && y<20 && y>0;
    }
}

コンポーネントの境界をコンストラクターが取得する文字列の幅に設定したいのですが、グラフィックス オブジェクトが必要なため、paintComponent メソッド内で行う場合にのみ動作させることができます。コンポーネントを再描画する必要があるたびに境界が再度設定され、作成時に一度だけ実行したいので、paintComponent メソッドでそれを行うのは間違っていると感じます。

これを解決する方法を提案してください。それとも、とにかくペイントコンポーネントでそれを行う必要がありますか?、それは機能しますが、私は良い解決策のようには感じません:(?

4

3 に答える 3

2

は使用しないでください。AbsoluteLayout本当に重要な理由がある場合にのみ、適切な を使用してくださいLayoutManager

JComponentたとえば、その親またはコンテナに返す必要があります(標準またはカスタムのすべてのLayoutManagerでPreferredSize通知が受け入れられるわけではありません)。PreferredSize

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ComponentEvent;
import javax.swing.JComponent;
import javax.swing.JFrame;

public class CustomComponent extends JFrame {

    private static final long serialVersionUID = 1L;

    public CustomComponent() {
        setTitle("Custom Component Graphics2D");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public void display() {
        CustomComponents cc = new CustomComponents();
        /*cc.addComponentListener(new java.awt.event.ComponentAdapter() {

            @Override
            public void componentResized(ComponentEvent event) {
                setSize(Math.min(getPreferredSize().width, getWidth()),
                        Math.min(getPreferredSize().height, getHeight()));
            }
        });*/
        add(cc, BorderLayout.CENTER);

        CustomComponents cc1 = new CustomComponents();
        add(cc1, BorderLayout.EAST);

        pack();
        // enforces the minimum size of both frame and component
        setMinimumSize(getSize());
        //setMaximumSize(getMaximumSize());
        setVisible(true);

    }

    public static void main(String[] args) {
        CustomComponent main = new CustomComponent();
        main.display();
    }
}

class CustomComponents extends JComponent {

    private static final long serialVersionUID = 1L;

    @Override
    public Dimension getMinimumSize() {
        return new Dimension(100, 100);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(400, 300);
    }

    @Override
    public Dimension getMaximumSize() {
        return new Dimension(800, 600);
    }

    @Override
    public void paintComponent(Graphics g) {
        int margin = 10;
        Dimension dim = getSize();
        super.paintComponent(g);
        g.setColor(Color.red);
        g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2);
    }
}
于 2012-04-17T15:38:15.717 に答える
1

グラフィックス コンテキストがなくても、TextLayoutまたはを使用FontRenderContextして境界を見つけることができます。ここで2 つを比較します。を拡張するため、mKorbel の回答JComponentに示されているように、コンポーネントはメソッドをオーバーライドする必要があります。getXxxSize()

于 2012-04-17T19:42:38.377 に答える
0

Font#getStringBounds(String str, FontRenderContext frc) を使用して、前述のフォントの形式で文字列の境界矩形を取得できます。そこから、幅と高さを返すことができます。

フォント Java 1.6 API

于 2012-04-17T15:39:36.130 に答える