首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用paint组件

调用paint组件
EN

Stack Overflow用户
提问于 2015-03-27 20:18:36
回答 1查看 63关注 0票数 0

我正在尝试用Java语言绘制对象,在TimerListener类中遇到了“无法解析符号paintComponent”(或符号g)的问题。我猜这很简单,但我似乎解决不了它?

代码语言:javascript
复制
import javax.swing.*;
import java.awt.*;
import java.awt.geom.Ellipse2D;


public class Beacon extends JPanel {
    private boolean choseOn = false;

   // Timer timer = new Timer(1000, onListener );

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        Rectangle box1 = new Rectangle(165, 75, 10, 25);
        g2.draw(box1);
        Rectangle box2 = new Rectangle(165, 100, 10, 25);
        g2.draw(box2);
        Rectangle box3 = new Rectangle(165, 125, 10, 25);
        g2.draw(box3);
        Rectangle box4 = new Rectangle(165, 150, 10, 25);
        g2.draw(box4);
        Rectangle box5 = new Rectangle(165, 175, 10, 25);
        g2.draw(box5);
        Rectangle box6 = new Rectangle(165, 200, 10, 25);
        g2.draw(box6);
        Rectangle box7 = new Rectangle(165, 225, 10, 25);
        g2.draw(box7);
        Rectangle box8 = new Rectangle(165, 250, 10, 25);
        g2.draw(box8);
        Rectangle box9 = new Rectangle(165, 275, 10, 25);
        g2.draw(box9);
        Rectangle box10 = new Rectangle(165, 300, 10, 25);
        g2.draw(box10);
        g2.setColor(Color.BLACK);
        g2.fill(box1);
        g2.fill(box3);
        g2.fill(box5);
        g2.fill(box7);
        g2.fill(box9);
        Ellipse2D.Double light = new Ellipse2D.Double(145, 26, 50, 50);
        if (choseOn) {
            //timer.setInitialDelay(1000);
            //timer.start();
            g2.setPaint(Color.GRAY);
            g2.fill(light);


        } else {
            g2.setColor(Color.ORANGE);
            g2.fill(light);
        }
    }
    public void chooseOn() { choseOn = false; }
    public void chooseOff() { choseOn = true; }

}

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Ellipse2D;


public class BeaconViewer extends JFrame {
    Timer timer;
    JButton off = new JButton("OFF");
    JButton on = new JButton("ON");
    JPanel panel1 = new JPanel();
    Beacon beaconPanel = new Beacon();

    public BeaconViewer() {
        panel1.add(off);
        panel1.add(on);
        this.add(panel1, BorderLayout.SOUTH);
        this.add(beaconPanel, BorderLayout.CENTER);
        //off.addActionListener(new offListener());
        //on.addActionListener(new onListener());

    }

    public static void main(String[] args) {
        JFrame beaconFrame = new BeaconViewer();
        beaconFrame.setTitle("Circle-Square");
        beaconFrame.setSize(350, 450);
        beaconFrame.setDefaultCloseOperation((JFrame.EXIT_ON_CLOSE));
        beaconFrame.setVisible(true);
    }

    class TimerListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {

            Ellipse2D.Double light = new Ellipse2D.Double(145, 26, 50, 50);
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;
            g2.setPaint(Color.ORANGE);
            g2.fill(light);
            repaint();
        }
    }


    //class offListener implements ActionListener {
      //  public void actionPerformed(ActionEvent e) {
        //    beaconPanel.chooseOff();
         //   repaint();
       // }
    //}
    //class onListener implements ActionListener {
      //  public void actionPerformed(ActionEvent e) {
        //    beaconPanel.chooseOn();
          //  repaint();
        //}
    }
//}
EN

回答 1

Stack Overflow用户

发布于 2015-03-28 03:02:06

首先,你不应该有像chooseOn()和choseOff()这样的方法。相反,你应该这样做:

代码语言:javascript
复制
public void setChooseOn(boolean chooseOn)
{
    this.chooseOn = chooseOn;
    repaint();
}

public Boolean getChooseOn()
{
    return chooseOn;
}

也就是说,每当您想要更改类的属性时,都应该为该属性提供一个getter和一个setter

我在TimerListener类中遇到问题

您不能在侦听器类中进行绘制。绘制仅在面板的paintComponent()方法中完成。

因此,Timer侦听器类中的代码将类似于OffListener和OnListener类中的代码。也就是说,您可以调用更改属性的方法。

因此,在您的示例中,代码可能如下所示:

代码语言:javascript
复制
beaconPanel.setChooseOn( ! beconPanel.getChooseOn() );

此代码将在每次调用计时器时在true/false之间切换属性。不需要调用repaint(),因为setChooseOn(...)方法会为您做这件事。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29300497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档