Leo G
Leo G

Reputation: 1

repaint() method not calling paintCompnent

I am trying to make a JFrame program that interfaces a binary-decimal-hexadecimal converter with buttons. A part of this, I would like to draw circles to represent binary numbers in a row of circles with a filled circle representing a one and an empty circle representing a zero. However, when I try to call repaint to draw anything, it does not execute the paintComponent() method, which I know because it does not perform the print statement inside of it. Full code below:

package e2;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.FlowLayout;

public class DecBin extends JPanel {

    String theText = "IT WORKS";
    int style = Font.BOLD; // bold only
    Font font = new Font("Arial", style, 40);

    DecBin() {
        JFrame f = new JFrame("Decimal to binary and binary to decimal converter");
        f.setSize(1000, 1000);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLayout(new FlowLayout());

        Font font = new Font("Arial", style, 40);
        JLabel textLabel = new JLabel(theText);
        textLabel.setFont(font);

        JButton b = new JButton("DectoBin");
        b.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String msg = JOptionPane.showInputDialog("input a decimal number");
                int num = Integer.parseInt(msg);
                theText = num + " is " + decToBin(num) + " in binary";
                textLabel.setText(theText);
            }
        });
        f.add(b);

        JButton d = new JButton("BintoDec");
        d.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String msg = JOptionPane.showInputDialog("input a binary number");
                System.out.print("The decimal form of " + msg + " is " + binToDec(msg));
                theText = msg + " is " + binToDec(msg) + " in decimal";
                textLabel.setText(theText);
            }
        });
        f.add(d);

        JButton hd = new JButton("hexToDec");
        hd.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String msg = JOptionPane.showInputDialog("input a hexadecimal number");
                theText = msg + " is " + hexToDec(msg) + " in decimal";
                textLabel.setText(theText);
            }
        });
        f.add(hd);

        JButton dh = new JButton("DectoHex");
        dh.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String msg = JOptionPane.showInputDialog("input a decimal number");
                int num = Integer.parseInt(msg);
                theText = num + " is " + decToHex(num) + " in hexadecimal";
                textLabel.setText(theText);
            }
        });
        f.add(dh);

        JButton bh = new JButton("BinToHex");
        bh.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String msg = JOptionPane.showInputDialog("input a binary number");
                theText = msg + " is " + decToHex(binToDec(msg)) + " in hexadecimal";
                textLabel.setText(theText);
            }
        });

        f.add(bh);

        JButton hb = new JButton("HexToBin");
        hb.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String msg = JOptionPane.showInputDialog("input a Hexadecimal number");
                theText = msg + " is " + decToBin(hexToDec(msg)) + " in hexadecimal";
                textLabel.setText(theText);
            }
        });
        f.add(hb);

        JButton c = new JButton("Draw");
        c.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.out.print("test1");
                validate();
                repaint();
            }
        });
        f.add(c);
        f.add(textLabel, BorderLayout.SOUTH);
        f.setVisible(true);
    }

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

    static String decToBin(int d) {
        StringBuilder binary = new StringBuilder("");
        while (d != 0) {
            binary.insert(0, d % 2);
            d = d / 2;
        }
        return binary.toString();
    }

    static int binToDec(String b) {
        int total = 0;
        int x;
        for (int i = b.length(); i > 0; i--) {
            x = Integer.parseInt(Character.toString(b.charAt(i - 1)));
            if (x == 1) {
                total += Math.pow(2, b.length() - i);
            }
        }
        return total;
    }

    public void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        g2.setColor(Color.red);
        g2.fillOval(100, 100, 20, 20);
        System.out.print("painted components");
    }

    static String decToHex(int d) {
        StringBuilder Hex = new StringBuilder("");
        while (d != 0) {
            int remainder = d % 16;
            if (remainder < 10) {
                Hex.insert(0, d % 16);
            } else if (remainder == 10) {
                Hex.insert(0, 'A');
            } else if (remainder == 11) {
                Hex.insert(0, 'B');
            } else if (remainder == 12) {
                Hex.insert(0, 'C');
            } else if (remainder == 13) {
                Hex.insert(0, 'D');
            } else if (remainder == 14) {
                Hex.insert(0, 'E');
            } else if (remainder == 15) {
                Hex.insert(0, 'F');
            }
            d = d / 16;
        }
        return Hex.toString();
    }

    static int hexToDec(String b) {
        int total = 0;
        int len = b.length();
        for (int i = len - 1; i >= 0; i--) {
            if (b.charAt(i) == 'A') {
                total += 10 * Math.pow(16, len - i - 1);
            } else if (b.charAt(i) == 'B') {
                total += 11 * Math.pow(16, len - i - 1);
            } else if (b.charAt(i) == 'C') {
                total += 12 * Math.pow(16, len - i - 1);
            } else if (b.charAt(i) == 'D') {
                total += 13 * Math.pow(16, len - i - 1);
            } else if (b.charAt(i) == 'E') {
                total += 14 * Math.pow(16, len - i - 1);

            } else if (b.charAt(i) == 'F') {
                total += 15 * Math.pow(16, len - i - 1);
            } else {
                total += Character.getNumericValue(b.charAt(i)) * Math.pow(16, len - i - 1);
            }
        }
        return total;
    }
}

Pertinent code in my opinion is:

DecBin() {
    JFrame f=new JFrame("Decimal to binary and binary to decimal converter");
    f.setSize(1000,1000);    
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setLayout(new FlowLayout());
    JButton c =new JButton("Draw");    
    c.addActionListener(new ActionListener() { 
            public void actionPerformed(ActionEvent e) {
            System.out.print("test1");
            validate();
            repaint();
        }
    });
    f.add(c);
    f.setVisible(true);    
}

public void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        g2.setColor(Color.red);
        g2.fillOval(100, 100, 20, 20);
        System.out.print("painted components");
}
public static void main(String[] args) {
    new DecBin();
}

I have spent hours researching this and have yet to find a solution that will get "painted components" to print.

Upvotes: 0

Views: 41

Answers (1)

Joe C
Joe C

Reputation: 15684

You do not appear to be adding your DecBin panel to any other UI element. It therefore has no reason to be painted.

You should avoid initializing JFrames inside the constructor of your JPanel child class - it should really be the other way around. That will make things easier to understand (and to debug).

Upvotes: 1

Related Questions