首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >自定义JComponent不适用于流布局

自定义JComponent不适用于流布局
EN

Stack Overflow用户
提问于 2015-09-21 19:59:02
回答 1查看 136关注 0票数 0

我创建了一个扩展JComponent的类,并希望在JPanel上使用它。如果我设置了它的界限,我就不能以我想要的方式在FlowLayout中使用它;它出现在JPanel上,就好像它在使用绝对定位。如果我不指定边界,它就根本不会出现。解决办法是什么?

谢谢。

JMotor.java

代码语言:javascript
运行
复制
public class JMotor extends JComponent {

    public void paint(Graphics g) {

        Graphics2D g2 = (Graphics2D) g;
        BufferedImage img = null;

        try {
            img = ImageIO.read(new File("motor.jpg"));
        } 

        catch (Exception e) {

        }

        g2.drawImage(img, 5, 5, this);
        //setBounds(5, 5, 100, 50);
    }
}

Scada.java

代码语言:javascript
运行
复制
public class Scada {

    JFrame scadaFrame;
    JPanel scadaPanel;

    Scada () {

        scadaFrame = new JFrame("Scada");
        scadaFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        scadaPanel = new JPanel();          

        scadaPanel.add(new JSuruculuMotor());
        scadaPanel.add(new JMotor());

        scadaFrame.setContentPane(scadaPanel);
        scadaFrame.setSize(600,300);    
        scadaFrame.setVisible(true);
    }

    public static void main(String[] args) {

        new Scada();

    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-21 20:16:16

它不能工作的原因是因为FlowLayout尊重组件的首选大小,并且您没有指定自定义组件的首选大小。

您需要重写类的getPreferredSize()方法,以便将其大小返回给布局管理器可以完成的工作。

自定义绘画是通过重写paintComponent()方法来完成的。另外,不要在绘画方法中做I/O。图像应该在类的构造函数中读取。

但是,问题是为什么要创建自定义组件?只需使用JLabelImageIcon

如果希望图像从顶部/左侧显示5个像素,则向标签中添加边框:

代码语言:javascript
运行
复制
label.setBorder( new EmptyBorder(5, 5, 5, 5) );
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32703542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档