【问题标题】:rapaint(); repaint's immediately after drawing拉漆();绘制后立即重绘
【发布时间】:2015-12-12 22:35:51
【问题描述】:

我刚开始使用 JAVA,我正在尝试使用输入绘制图像。 我希望在给出新值并单击“绘制”按钮时面板“刷新/重新加载”。 我尝试了所有不同的 removeALL();重绘();重新验证();在不同的地方。

使用 removeAll();窗口冻结。 只有重绘();并重新验证();图像仅停留一秒钟。

我希望图像保持不变,直到给出新值并单击按钮。 向下她是代码的一部分。 谢谢。

public void actionPerformed (ActionEvent event) {
    Graphics paper = panel.getGraphics();

    String input = field.getText();
    String input2 =field2.getText(); 
    int x = Integer.parseInt(input);
    int y = Integer.parseInt(input2);

    paper.setColor(Color.red);
    paper.fillOval(x, y, 50, 50);

    paper.setColor(Color.blue);
    paper.fillOval((x+100), y, 35, 35);

    paper.setColor(Color.blue);
    paper.fillOval(x, (y+100), 35, 35);

    paper.setColor(Color.black);
    paper.drawLine((x+49), (y+25), (x+102), (y+20));

    paper.setColor(Color.black);
    paper.drawLine((x+25), (y+49), (x+20), (y+102));

    //removeAll();
    //revalidate();
    //repaint();
}

我在不同的功能中尝试过:

public void actionPerformed (ActionEvent event) {
    Graphics paper = panel.getGraphics();
    function(paper);
    repaint();
    revalidate();
}

public void function (Graphics paper){
.... } 

没用..

【问题讨论】:

  • 通常情况下,您应该重新定义:public void paint(Graphics g) {...},并且只在您的actionPerformed(...) 中调用repaint();
  • 重写 paintComponent() 并使用作为参数传递的 Graphics 对象,而不是尝试在 ActionListener 中进行绘制。
  • 如果要离线准备图像,请将其绘制到 BufferedImage,然后在面板的 paint(Graphics) 方法中绘制该图像。

标签: java swing


【解决方案1】:

不要调用 panel.getGraphics() 从被覆盖的 paintComponents 方法中获取它。像这样:

public class MyJFrame extends JFrame {

    final JTextField field;
    final JTextField field2;
    final JButton btn;
    final MyJPanel panel;

    public MyJFrame() {
        setLayout(new FlowLayout());
        field = new JTextField("10");
        add(field);
        field2 = new JTextField("10");
        add(field2);
        btn = new JButton("paint");
        add(btn);
        panel = new MyJPanel();
        panel.setPreferredSize(new Dimension(200, 200));
        add(panel);
        btn.addActionListener(e -> {
            panel.repaint();
        });
        pack();
    }

    class MyJPanel extends JPanel {

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics paper = g;
            String input = field.getText();
            String input2 = field2.getText();
            int x = Integer.parseInt(input);
            int y = Integer.parseInt(input2);

            paper.setColor(Color.red);
            paper.fillOval(x, y, 50, 50);

            paper.setColor(Color.blue);
            paper.fillOval((x + 100), y, 35, 35);

            paper.setColor(Color.blue);
            paper.fillOval(x, (y + 100), 35, 35);

            paper.setColor(Color.black);
            paper.drawLine((x + 49), (y + 25), (x + 102), (y + 20));

            paper.setColor(Color.black);
            paper.drawLine((x + 25), (y + 49), (x + 20), (y + 102));
        }

    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(() -> {
            new MyJFrame().setVisible(true);
        });
    }
}

【讨论】:

    猜你喜欢
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多