将 JComponent 的边界设置为字符串的像素宽度



我有这个内部类:

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方法中执行此操作感觉不对,因为每次必须重新绘制组件时,它都会再次设置边界,我只想在创建时执行此操作一次。

建议我如何解决这个问题?还是我应该在paintComponent中做?,它可以工作,但我觉得不是一个很好的解决方案:(?

请不要使用AbsoluteLayout,只有在有真正重要原因的情况下,才使用适当的LayoutManager

您的JComponentPreferredSize(请注意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);
    }
}

即使没有图形上下文,您也可以使用 TextLayoutFontRenderContext 来查找边界; 这里对两者进行了比较。因为你扩展了JComponent,所以你的组件应该覆盖getXxxSize()方法,如mKorbel的答案所示。

您可以使用 Font

#getStringBounds(String str, FontRenderContext frc) 以所述 Font 的形式获取字符串的边界矩形。从那里您可以返回宽度和高度。

字体 Java 1.6 API

相关内容

  • 没有找到相关文章

最新更新