Java repaint () не работает при вызове из другого класса - PullRequest
0 голосов
/ 28 апреля 2018

Мой перерисовка работает, когда вызывается в том же классе, но не из другого класса. Я не смог найти эту проблему в другом месте. Я поставил свой код ниже. Спасибо! Код предназначен для создания калькулятора в JFrame с 2 JPanels, один из которых отображает ввод пользователя, а другой со всеми кнопками. Я хочу вызвать repaint, поэтому метод drawString () изменяется при вводе пользователем своих данных.

public class Calculator
{
    public static void main(String[] args)
    {
        Calculator c = new Calculator();
    }

    public Calculator()
    {
        JFrame frame = new JFrame("Calculator");
        frame.setSize(800,  800);
        frame.setResizable(false);
        Buttons b = new Buttons();
        Display d = new Display();
        frame.setLayout(new GridLayout(2, 1));
        frame.add(d);
        frame.add(b);
        frame.setVisible(true);
    }

    public class Buttons extends JPanel implements ActionListener
    {
        private int z;
        public JButton[] buttons;
        public Display d;`enter code here`
        public String[] values;
        public String clickedButton;

        public Buttons()
        {
            setBackground(Color.BLACK);
            setLayout(new GridLayout(5, 4));
            values = new String[100];
            for(int i = 0; i < values.length; i++)
            {
                values[i] = new String("");
            }
            addButtons();
        }

        public void addButtons()
        {
            Font courier = new Font("Courier", Font.BOLD, 20);
            buttons = new JButton[20];

            for(int i = 0; i < buttons.length; i++)
            {
                buttons[i] = new JButton(Integer.toString(i));
                buttons[i].setBackground(Color.BLUE);
                buttons[i].setForeground(Color.WHITE);
                buttons[i].setFont(courier);
                buttons[i].setFocusable(false);
                buttons[i].addActionListener(this);
                buttons[i].setBorder(BorderFactory.createLineBorder(new Color(0, 100, 175, 255)));
                add(buttons[i]);
            }

            buttons[10].setVisible(false);
            buttons[10].setEnabled(false);
            buttons[11].setVisible(false);
            buttons[11].setEnabled(false);

            buttons[12].setText("C");
            buttons[13].setText("+");
            buttons[14].setText("-");
            buttons[15].setText("*");
            buttons[16].setText("/");

            buttons[17].setText("+/-");
            buttons[18].setText("^");
            buttons[19].setText("=");
        }

        public void actionPerformed(ActionEvent e)
        {
            String action = e.getActionCommand();
            d = new Display();
            for(int i = 0; i < 10; i++)
            {
                if(action.equals(Integer.toString(i)))
                {
                    values[d.i]+=Integer.toString(i);
                    System.out.println("should be repainting");
                    d.repaint();
                }
            }
        }
    }

    public class Display extends JPanel
    {
        public Buttons b;
        public Font courier;
        public int i;

        public Display()
        {
            i = 0;
            b = new Buttons();
            setBackground(Color.BLACK);
            courier = new Font("Courier", Font.BOLD, 50);
        }

        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            g.setColor(Color.BLUE);
            g.setFont(courier);
            g.drawString(b.values[i], 50, 50);
            repaint();
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Кажется, вы каждый раз создаете новый дисплей и говорите, чтобы он перекрашивался вместо реального. Переместите переменную Display d в класс Calculator в качестве поля и не объявляйте новые.

Вы создаете исходный объект Display как локальную переменную, чтобы к нему нельзя было получить доступ из других мест, поэтому вместо этой части используйте поле класса:

Display d = new Display();

Кроме того, эта строка в actionPerformed создает новый экземпляр и должна быть удалена:

d = new Display();
0 голосов
/ 28 апреля 2018
  1. Не вызывайте repaint из метода рисования. Это заставит API планировать другой запрос рисования, который в конечном итоге потребляет все ваши циклы ЦП
  2. На самом деле у вас есть два экземпляра Display, один на экране, другой не

Хотя есть несколько способов исправить это, одним из более простых будет просто передать экземпляр Display, созданный в конструкторе Calculator, в Buttons, например ...

public class Calculator {

    public static void main(String[] args) {
        Calculator c = new Calculator();
    }

    public Calculator() {
        JFrame frame = new JFrame("Calculator");
        frame.setSize(800, 800);
        frame.setResizable(false);
        Display d = new Display();
        Buttons b = new Buttons(d);
        frame.setLayout(new GridLayout(2, 1));
        frame.add(d);
        frame.add(b);
        frame.setVisible(true);
    }

    public class Buttons extends JPanel implements ActionListener {

        private int z;
        private JButton[] buttons;
        private String[] values;
        private String clickedButton;

        private Display d;

        public Buttons(Display d) {
            this.d = d;
            setBackground(Color.BLACK);
            setLayout(new GridLayout(5, 4));
            values = new String[100];
            for (int i = 0; i < values.length; i++) {
                values[i] = new String("");
            }
            addButtons();
        }

Затем кнопки могут использовать этот экземпляр для отображения того, что ему нужно для отображения

        private int index = 0;

        public void actionPerformed(ActionEvent e) {
            String action = e.getActionCommand();
            for (int i = 0; i < 10; i++) {
                if (action.equals(Integer.toString(i))) {
                    values[index] += Integer.toString(i);
                    d.setValue(values[index]);
                    index++;
                }
            }
        }
    }

    public class Display extends JPanel {

        public Font courier;
        private String value;

        public Display() {
            setBackground(Color.BLACK);
            courier = new Font("Courier", Font.BOLD, 50);
        }

        public void setValue(String value) {
            this.value = value;
            repaint();
        }

        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.BLUE);
            g.setFont(courier);
            if (value != null) {
                g.drawString(value, 50, 50);
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...