【问题标题】:Drawing rectangles on a JPanel在 JPanel 上绘制矩形
【发布时间】:2011-12-05 03:12:02
【问题描述】:

我有一个 JScrollPane,在它上面我有一个名为“panel1”的 JPanel。 我想在这个 JPanel 上绘制一些矩形。

我有一个名为 DrawRectPanel 的类,它扩展 JPanel 并完成所有绘图工作。 问题是,我尝试通过编写以下代码在 panel1 上绘制矩形:

panel1.add(new DrawRectPanel());

但是 panel1 上没有出现任何内容 然后我尝试了,就像对 DrawRectPanel 类的测试一样:

JFrame frame = new JFrame();
frame.setSize(1000, 500);
Container contentPane =    frame.getContentPane();
contentPane.add(new DrawRectPanel());
frame.show();

这很有效,并且生成了图纸,但在单独的 JFrame 上 如何在 panel1 上绘制矩形? 提前致谢。

编辑: DrawRectPanel 的代码

public class DrawRectPanel extends JPanel  {

    DrawRectPanel() {
        Dimension g = new Dimension(400,400);
        this.setPreferredSize(g);
        System.out.println("label 1");
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        System.out.println("label 2");
        g.setColor(Color.red);
        g.fillRect(20, 10, 80, 30);
    }
 }

屏幕上只打印标签 1

【问题讨论】:

  • 不知道为什么,请在此处以sscce.org 形式发布(编辑您的问题)代码
  • 如果您不显示DrawRectPanel 的代码,那么任何人都无法真正帮助您。不过我猜一下:DrawRectPanel 没有首选尺寸,是吗?
  • 一个 SSCCE 比更多的代码 sn-ps 有用得多。请阅读链接的文章。

标签: java swing jpanel draw graphics2d


【解决方案1】:

要解决您的问题,当窗口自动重绘时,将“paintComponent”更改为“paint”,它应该可以工作。

【讨论】:

    【解决方案2】:

    还是不知道,

    例如

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    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() {
            add(new CustomComponents());
            pack();
            // enforces the minimum size of both frame and component        
            setMinimumSize(getSize());
            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 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);
        }
    }
    

    【讨论】:

    • +1,关键是你需要为布局管理器提供一个首选的尺寸。
    【解决方案3】:

    而不是添加

    contentPane.add(new DrawRectPanel());
    

    你应该这样做

    contentPane.add(panel1);
    

    因为您在 panel1 中已经有了新的DrawRectPanel。但是在您的代码中,您将在contentPane 中添加另一个DrawRectPanel 实例。并且从未在您的任何container 中添加panel1。

    【讨论】:

    • 首先,我应该在滚动窗格上添加 panel1 (覆盖paintcomponent函数),所以我应该写 scrollpane.add(panel1) ,如果我这样做,只有 panel1 的构造函数被调用,而不是paintcomponent 函数本身,你知道为什么吗?
    • 可以通过panel1.repaint();panel1.validate();手动调用paintcomponent;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多