[英]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());
}
}
現在,因為在您的示例中, UserInterface
或Canvas
類都沒有真正直接相互交談,所以該模型設置了一個“觀察者模式”,該模式用於通知相關方模型狀態已更改。
您還將注意到, 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.