Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JComponent到字符串像素宽度的设置边界_Java_Swing_Paintcomponent_Jcomponent_Absolutelayout - Fatal编程技术网

Java JComponent到字符串像素宽度的设置边界

Java JComponent到字符串像素宽度的设置边界,java,swing,paintcomponent,jcomponent,absolutelayout,Java,Swing,Paintcomponent,Jcomponent,Absolutelayout,我有一个内在的阶级: 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 Dimensi

我有一个内在的阶级:

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中使用它吗?它可以工作,但我觉得不是一个好的解决方案:?

请不要使用绝对布局,只有在有非常重要的原因时,才使用适当的布局管理器

例如,您的JComponent应该是returns PreferredSize notice 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);
    }
}

您可以使用FontgetStringBoundsString str、FontRenderContext frc以所述字体的形式获取字符串的边框。从那里可以返回宽度和高度


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

很抱歉,我真的不知道您想告诉我什么。我不想要一个布局经理,因为我需要把他们放在我用鼠标点击的地方mouse@Ceilingbat我需要把它们准确地放在我用鼠标点击的地方,最后一些清晰的信息:-,请用这个和另一个编辑你的问题(如果存在的话)……我需要将它们精确地放置在我用鼠标单击的位置,使用自定义WhereverIDropThisSh*t布局。定位逻辑不应该在组件内部,它只是放错了位置。我认为这对我来说有点太难了,我目前正在大学学习第二门编程课程,但感谢你指出这一点。我认为这对我来说有点太难了。什么是?编程-放弃它;逻辑,大学;向人们传达你的观点;成为隐士。组件不应该设置自己的边界!让布局来决定。我想将组件的边界设置为构造函数得到的字符串的宽度作为一个边线。带有布局的JLabel具有内置的。你为什么要重新设计杠杆?要做到这一点,我需要先得到图形对象,然后再得到FontRenderContext,我认为我无法在paintComponent methodOops之外得到图形对象,很抱歉缺少链接。