【问题标题】:Custom JComponent does not work with flow layout自定义 JComponent 不适用于流布局
【发布时间】:2015-09-21 19:59:02
【问题描述】:

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

谢谢。

JMotor.java:

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:

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();

    }
}

【问题讨论】:

  • 您是否尝试过使用 JPanel 代替 JComponent 并在其上绘制图像?
  • 顺便说一句,如果您不需要该面板用于其他任何用途,您也可以只(删除自定义面板并)使用new JLabel(new ImageIcon(imagePath))
  • @AndrewThompson 是的,这就是我的想法。幸运的是,camickr 已经在他的回答中添加了这一点。
  • @LuxxMiner “幸运的是 camickr 已经在他的回答中添加了这一点。” LOL.. 没注意到!
  • 以后不要在你的paint方法中加载资源

标签: java swing layout-manager flowlayout


【解决方案1】:

它不起作用的原因是因为 FlowLayout 尊重组件的首选大小,而您没有指定自定义组件的首选大小。

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

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

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

如果您希望图像显示在距顶部/左侧 5 个像素的位置,则向标签添加边框:

label.setBorder( new EmptyBorder(5, 5, 5, 5) );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多