簡體   English   中英

嘗試從GUI繪制煙花時出現問題

[英]Issue when attempting to draw fireworks from GUI

我有兩個類,一個叫做“用戶界面”,另一個是“畫布”,我需要用戶能夠輸入速度,角度和時間的值,才能將煙花渲染到“畫布”上。 但是,當我使用按鈕觸發捕獲JTextFields值的內容時,Canvas不會repaint()。 無論我輸入什么值,都不會發生。我在另一個類中定義了x和y,但getter和setter不會產生任何值。

為什么在我調用repaint()時無法在Canvase上繪制我的形狀?

public class Userinterface extends JPanel implements ActionListener{

    private static final long serialVersionUID = 1L;
    private static String str= "0";
    private static String str2= "0";
    private static String str3= "0";
    private JTextField angle= new JTextField(5);
    private JLabel alabel= new JLabel("Angle");
    private JTextField velocity= new JTextField(5);
    private JLabel vlabel= new JLabel("Velocity");
    private JButton Actionbutton= new JButton("launch");
    private JTextField time= new JTextField(5);
    private JLabel tlabel= new JLabel ("Time of fuse (s)");
    static int a;
    static int b;
    static int c;
    static int x;
    static int y;

    Userinterface(){
        setLayout(new FlowLayout(FlowLayout.CENTER));
        add(time);
        add(tlabel);
        add (angle);
        add(alabel);
        add (velocity);
        add(vlabel);
        add(Actionbutton);
        Actionbutton.addActionListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource()==Actionbutton) {
        str=angle.getText();
        str2=velocity.getText();
        str3=time.getText();
        a=Integer.parseInt(str);
        b=Integer.parseInt(str2);
        c=Integer.parseInt(str3);
        repaint();  // ISSUE: Canvas does not repaint here
    }   
}

public static int findx() {
    x=Fire_WorkMath.calculatex(b, c, a);
    return x;
}

public static int findy() {
    y=Fire_WorkMath.calculatey(b, c, a);
    return y;
}

public class Canvas extends JPanel {

    Userinterface one= new Userinterface();
    int ang;
    int time;
    int y;
    int x;

    private static final long serialVersionUID = 1L;

    public Canvas() {

    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        x=Userinterface.findx();
        y=Userinterface.findy();
        g.drawLine(0, 0, x, y);
    }
}

對象之間的共享狀態有時可能很復雜。 在最基本的級別上,您要做的是將它們所依賴的對象的相同實例傳遞給它們。

在這里,您將要建立一個可以在兩個類之間共享的“模型”。

public class FireworkModel {

    private int angle;
    private int velocity;
    private int time;

    private List<ChangeListener> changeListeners;

    public FireworkModel() {
        changeListeners = new ArrayList<>();
    }

    public void addChangeListener(ChangeListener listener) {
        changeListeners.add(listener);
    }

    public void removeChangeListener(ChangeListener listener) {
        changeListeners.remove(listener);
    }

    protected void fireStateChanged() {
        ChangeEvent evt = new ChangeEvent(this);
        for (ChangeListener listener : changeListeners) {
            listener.stateChanged(evt);
        }
    }

    public void setAngle(int angle) {
        this.angle = angle;
        fireStateChanged();
    }

    public void setVelocity(int velocity) {
        this.velocity = velocity;
        fireStateChanged();
    }

    public void setTime(int time) {
        this.time = time;
        fireStateChanged();
    }

    public int getAngle() {
        return angle;
    }

    public int getVelocity() {
        return velocity;
    }

    public int getTime() {
        return time;
    }

    public int findx() {
        return Fire_WorkMath.calculatex(getVelocity(), getTime(), getAngle());
    }

    public int findy() {
        return Fire_WorkMath.calculatey(getVelocity(), getTime(), getAngle());
    }

}

現在,因為在您的示例中, UserInterfaceCanvas類都沒有真正直接相互交談,所以該模型設置了一個“觀察者模式”,該模式用於通知相關方模型狀態已更改。

您還將注意到, findx/y方法也已移至此處,這樣,那些需要它們的各方可以輕松訪問它們。

接下來,我們更改Canvas (由於SDK中有Canvas類,我將其重命名為FireworksPane )以使用此模型...

public class FireworksPane extends JPanel {

    private FireworkModel model;

    private static final long serialVersionUID = 1L;

    public FireworksPane(FireworkModel model) {
        this.model = model;
        model.addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                repaint();
            }
        });
    }

    public FireworkModel getModel() {
        return model;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        int x = getModel().findx();
        int y = getModel().findy();
        g.drawLine(0, 0, x, y);
    }
}

最后,我們更新UserInterface以也使用該模型...

public class Userinterface extends JPanel implements ActionListener {

    private final long serialVersionUID = 1L;
    private JTextField angle = new JTextField(5);
    private JLabel alabel = new JLabel("Angle");
    private JTextField velocity = new JTextField(5);
    private JLabel vlabel = new JLabel("Velocity");
    private JButton Actionbutton = new JButton("launch");
    private JTextField time = new JTextField(5);
    private JLabel tlabel = new JLabel("Time of fuse (s)");

    private FireworkModel model;

    Userinterface(FireworkModel model) {
        setLayout(new FlowLayout(FlowLayout.CENTER));
        add(time);
        add(tlabel);
        add(angle);
        add(alabel);
        add(velocity);
        add(vlabel);
        add(Actionbutton);
        Actionbutton.addActionListener(this);
        this.model = model;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == Actionbutton) {
            String str = angle.getText();
            String str2 = velocity.getText();
            String str3 = time.getText();
            int angle = Integer.parseInt(str);
            int velocity = Integer.parseInt(str2);
            int time = Integer.parseInt(str3);

            model.setAngle(angle);
            model.setVelocity(velocity);
            model.setTime(time);
        }
    }
}

如果您希望這兩個類都能正常工作,則這兩個類都需要將模型的SAME實例傳遞給他們。

FireworkModel model = new FireworkModel();
Userinterface userinterface = new Userinterface(model);
FireworksPane fireworksPane = new FireworksPane(model);
// Setup the remaining UI

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM