简体   繁体   English

重新绘制另一个JPanel中的JPanel

[英]repaint JPanel which is inside another JPanel

Here is the thing: 这是东西:

public class ParentPanel extends JPanel{
    private ChildPanel childPanel;
    public ParentPanel() {
        super();
        initComponents();
    }
    public void pushData(int data){
        childPanel.pushData(data);
    }
    private void initComponents() {
        childPanel= new ChildPanel();
}

I have another class: 我还有另一堂课:

public class ChildPanel extends JPanel{
    public ChildPanel(){
        super();
    }
    public void paintComponent(Graphics g){
        //I draw some lines in this JPanel according to data
    }
    public void pushData(int data){
        repaint();
    }
}

What I want is to draw some lines when the pushData() method inside ChildPanel is called. 我想要的是在pushData()方法时画一些线。 But now there is no responding inside the ChildPanel. 但是现在ChildPanel内部没有任何响应。 What should I do? 我该怎么办?

childPanel is not part of any container, its paintComponent is not going to be called. childPanel不是任何容器的一部分,不会调用其paintComponent Try adding it as a child to ParentPanel , ie inside initComponents call add(childPanel) . 尝试将其作为子项添加到ParentPanel ,即在initComponents内部调用add(childPanel)

EDIT: sample based on posted code 编辑:基于已发布代码的示例

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class TestChild {
    public static void main(String[] args){
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final ParentPanel parent = new ParentPanel();
        JButton button = new JButton("Push");
        button.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                parent.pushData(7);
            }
        });

        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());

        panel.add(parent, BorderLayout.CENTER);
        panel.add(button, BorderLayout.SOUTH);

        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
        frame.setLocationRelativeTo(null);
    }

    public static class ParentPanel extends JPanel {
        private ChildPanel childPanel;

        public ParentPanel() {
            super();
            initComponents();
        }

        public void pushData(int data) {
            childPanel.pushData(data);
        }

        private void initComponents() {
            childPanel = new ChildPanel();
            add(childPanel);
        }
    }

    public static class ChildPanel extends JPanel {
        private Random random = new Random();

        public ChildPanel() {
            super();
            setPreferredSize(new Dimension(200, 200));
        }

        @Override
        public void paintComponent(Graphics g) {
            System.out.println(getWidth());
            g.setColor(getBackground());
            g.fillRect(0, 0, getWidth(), getHeight());
            g.setColor(Color.getHSBColor(random.nextFloat(), 0.9f, 1.0f));
            g.fillOval(0, 0, getWidth(), getHeight());
        }

        public void pushData(int data) {
            repaint();
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM