简体   繁体   中英

Why doesn't my JPanel change when I call repaint()?

I have the following piece of code that I would like help with...

public class Nodes extends JPanel implements ActionListener, MouseListener, MouseMotionListener {

    private static JPanel p1;
    private static JPanel p2;
    private JButton linkButton, nodeButton;
    private Vector nodeVector, linkVector;
    private Vector<Integer> data;
    private String s1,s2;
    public int x;
    int pt1;
    public int pt2;
    private Rectangle Node;
    private boolean f1, f2 = false;

    Nodes () {
        JFrame F = new JFrame ("Add Node / Add Link");
        nodeVector = new Vector ();
        linkVector = new Vector ();
        data = new Vector <Integer> ();
        F.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        F.setVisible (true);
        F.setSize (500, 500);
        p1 = new JPanel ();
        p2 = new JPanel ();
        linkButton = new JButton ("Add Link");
        nodeButton = new JButton ("Add Node");
        linkButton.addActionListener (this);
        nodeButton.addActionListener (this);
        p2.addMouseListener (this);
        p2.addMouseMotionListener (this);
        p1.add (linkButton);
        p1.add (nodeButton);
        F.add (p1,BorderLayout.SOUTH);
        F.add (p2,BorderLayout.CENTER);
        p2.setBackground (Color.WHITE);
    }

    public void paintComponent (Graphics g) {
        super.paintComponent (g);
        Graphics2D g2d = (Graphics2D)(g);
        BufferedImage buffImage = new BufferedImage (25,25,BufferedImage.TYPE_INT_RGB);
        Graphics2D gg = buffImage.createGraphics ();
        gg.setColor (Color.GRAY);
        gg.fillRect (0, 0, 25, 25);
        gg.setStroke (new BasicStroke (12.0f));
        gg.setColor (Color.BLUE);
        gg.drawString ("" + data, 10, 10);
        g2d.setPaint (new TexturePaint (buffImage, new Rectangle (25,25)));
        g.drawRect (pt1, pt2, 10, 10);
        repaint ();
    }

    public void actionPerformed(ActionEvent e){                   
        if(e.getSource()==linkButton){
        s1 = JOptionPane.showInputDialog (null, "Insert the first Node Number");
            s2 = JOptionPane.showInputDialog (null, "Insert the second Node Number");
        }
        if (e.getSource () == nodeButton){
            x = Integer.parseInt ((JOptionPane.showInputDialog (null, "Insert the Node Number")));
            for (int i = 0 ; i < data.size (); i++){ 
                if (x == (int) data.get (i))
                    x = Integer.parseInt (JOptionPane.showInputDialog (null, "Used before insert another number"));
            }
            data.add (x);
            f1 = true; 
        }
    }

    public void mouseClicked (MouseEvent e){
           f2 = true;
           if (f1){ 
               JOptionPane.showMessageDialog (null, "you clicked at" + e.getPoint ());
               pt1 = e.getX ();
               pt2 = e.getY ();
               f1 = !f1;
               repaint ();
           }
    }

    public static void main (String[] args) {
        new Nodes();
    }   
}

I am trying to update the display by calling repaint() , however the paintComponent() method doesn't work, and nothing actually changes. In the correct behaviour, when I press the "Add Node" button then click anywhere on the panel, a rectangle with the number the user entered should be drawn.

Could anyone please help explain what is wrong with my code.

Your main class is a JPanel, but it is not added to the JFrame, and its Panels/Buttons/whatnot.

Try it this way:

private Vector<Integer> data;
public int x;
int pt1;
public int pt2;
private Rectangle Node;
private boolean f1, f2 = false;
private JButton linkButton, nodeButton;

Nodes ()
{
    JFrame F = new JFrame ("Add Node / Add Link");
    Vector nodeVector, linkVector;
    nodeVector = new Vector ();
    linkVector = new Vector ();
    data = new Vector <Integer> ();
    F.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    F.setVisible (true);
    F.setSize (500, 500);

    JPanel p1 = new JPanel ();
    linkButton = new JButton ("Add Link");
    nodeButton = new JButton ("Add Node");
    linkButton.addActionListener (this);
    nodeButton.addActionListener (this);
    addMouseListener (this);
    addMouseMotionListener (this);
    p1.add (linkButton);
    p1.add (nodeButton);
    F.add (p1, BorderLayout.SOUTH);
    F.add (this, BorderLayout.CENTER);
    setBackground (Color.WHITE);
}

Many attributes can be local variables. JPanel p2 is removed and replaced by the JPanel which is this , which allows to use the paintComponent method to be used.

您永远不会将Nodes添加到组件层次结构中,因此,永远不会调用paintComponent。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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