从其他类调用时,Java repaint()无法正常工作

时间:2018-04-28 06:20:34

标签: java swing user-interface

我的重绘在同一个类中调用但不在另一个类中调用。我无法在其他地方找到这个问题。我把我的代码放在下面。谢谢!该代码用于在具有2个JPanel的JFrame中制作计算器,一个显示用户的输入,另一个显示所有按钮。我想调用重绘,以便drawString()方法在用户输入输入时更改。

temp: any = { id: '' };

myEvent() {
    this.http.get('url', {
        params: {
            id: this.temp.id,
            name: ???
        }
    })
}

2 个答案:

答案 0 :(得分:0)

  1. 不要在paint方法中调用repaint。这将导致API安排另一个绘制请求,这将最终消耗所有CPU周期
  2. 你实际上有两个Display个实例,一个在屏幕上,一个不是
  3. 虽然有几种方法可以解决这个问题,但更简单的方法之一就是将创建的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);
                }
            }
        }
    }
    

答案 1 :(得分:0)

您似乎每次都在创建一个新的显示器并告诉它重新绘制而不是真实的。将您的Display d变量作为字段移到Calculator类中,不要声明新的变量。

您将原始的Display对象创建为局部变量,因此无法从其他地方访问它,因此请将此部分改为使用类字段:

Display d = new Display();

此外,actionPerformed中的这一行正在创建一个新实例,应该删除:

d = new Display();