Java如何重绘JPanel(重新创建对象)?

时间:2011-11-08 10:35:19

标签: java swing resize drawing jpanel

我遇到一个问题,如果按下“c”键,我只需要重绘/重建绘图区域。 我正在使用repaint()的方式,结果是绘制区域的位置。 我还注意到,每当我重新调整框架大小时,keylistener就不再有效了。

问题:

  1. 无法正确重绘。
  2. keylistener在重新调整帧大小后无效。
  3. 喜欢附上显示器,但似乎因为我是新手而受阻。

    以下代码是调用“newZone”类的主要函数。

        frame.addComponentListener(new ComponentAdapter() { 
    
            public void componentResized(ComponentEvent e){
                System.out.println("component Rebuild"); 
                frame.getContentPane().removeAll();
                frame.getContentPane().invalidate();
                JComponent newContentPane = new newZone(frame.getSize());
                newContentPane.setOpaque(true);
                frame.getContentPane().add(newContentPane);
                frame.getContentPane().revalidate();
                frame.setContentPane(newContentPane); 
            }
        });
    

    以下是newZone类,其中包含Paint&的KeyListener:

    public class newZone extends JComponent implements MouseListener, MouseMotionListener, KeyListener {
    
    JPanel panel1;
    JTextArea textArea;
    JScrollPane scrollPane;
    MyDrawingTool Drawing;
    static int firsttimer = 0;
    static int preposX = 0;
    static int preposY = 0;
    static int widthPercentage = 80 , heightPercentage = 93;
    static int numberOfYboxes,numberOfXboxes;
    static Dimension currentPanelSize;
    static final String NEWLINE = System.getProperty("line.separator");
    static Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    
    
    public newZone(Dimension currentPanelSize1) {
    
        currentPanelSize = currentPanelSize1; 
    
        Drawing = new MyDrawingTool();
        Drawing.setBackground(Color.WHITE);
        Drawing.setBounds(  10, 10, 
                            (int) currentPanelSize.getWidth()*(widthPercentage)/100, 
                            (int) currentPanelSize.getHeight()*(heightPercentage)/100 );
        Drawing.setPreferredSize(new Dimension( (int) currentPanelSize.getWidth()*(widthPercentage)/100,
                                                (int) currentPanelSize.getHeight()*(heightPercentage)/100));
    
        Drawing.addMouseListener(this);
        Drawing.addMouseMotionListener(this);
    
        add(Drawing);
    
        addKeyListener(new KeyAdapter() 
        {
             public void keyPressed(KeyEvent e){ 
                 System.out.println( "Key type: "+e.getKeyChar()); 
    
                 if(e.getKeyChar() == 'c'){
                     Drawing.redraw();
                 }
             }
        });
        setFocusable(true);
    }
    
    
    class MyDrawingTool extends JPanel{
    
        void redraw(){
    
            repaint();
        }
    
        @Override
        public void paint(Graphics q){
    
            //super.paint(q);
    
            int j,k, width, height;
            int startX = 10, startY = 10;
            int boxSize = 50;
    
            width  = (int)currentPanelSize.getWidth()*(widthPercentage)/100;
            height = (int)currentPanelSize.getHeight()*(heightPercentage)/100;
    
            numberOfYboxes = (height-20)/50;
            numberOfXboxes = (width-20)/50;
    
            for ( j = 0; j < numberOfYboxes; j++)
            {   
                startX  = 10;
                for ( k = 0; k < numberOfXboxes; k++)
                {   
                    q.setColor(Color.WHITE);
                    q.fillRect(startX, startY, boxSize, boxSize);
                    q.setColor(Color.BLUE); //Set line color
                    q.drawRect(startX, startY, boxSize, boxSize);
                    startX+=boxSize;
                }
                startY+=boxSize;
    
            } 
        }
    } 
    

    }

2 个答案:

答案 0 :(得分:2)

我不知道你为什么使用ComponentListener。我没有看到任何理由删除/添加/ invalidate / revalidat并执行所有其他操作。

您需要做的就是将面板添加到框架内容窗格的CENTER中。随着框架调整大小,面板将自动增大/减小尺寸。不需要ComponentListener。

自定义绘画应该在paintComponent()方法中完成,不要忘记在开始时调用super.paintComponent(...)。

KeyListener不起作用,因为在调整帧大小后焦点现在位于JFrame(而不是面板)上。你不应该为此使用KeyListener。相反,即使面板没有焦点,你也应该Key Bindings

答案 1 :(得分:0)

看来,您根本不需要切换内容窗格。 如果您在默认内容窗格上使用某些布局,如@camickr建议的那样,您将无需手动处理调整大小和其他内容。 祝你好运。