Skip to content

Commit 061e1cc

Browse files
authored
Merge pull request #128 from jason-lang/revert-127-main
Revert "Add double-buffering to GridWorld view"
2 parents c4b6a76 + 647ea90 commit 061e1cc

File tree

3 files changed

+54
-98
lines changed

3 files changed

+54
-98
lines changed

examples/blocks-world/BlocksEnv/WorldModel.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import java.util.List;
88
import java.util.Stack;
99
import java.util.logging.Logger;
10-
import javax.swing.SwingUtilities;
1110

1211
public class WorldModel extends GridWorldModel {
1312

@@ -92,9 +91,7 @@ boolean move(String a, String b, List<String> adds, List<String> dels) throws Ex
9291
}
9392
modelToGrid();
9493
if (view != null)
95-
SwingUtilities.invokeLater(() -> {
96-
view.update();
97-
});
94+
view.update();
9895

9996
return true;
10097
}
@@ -158,16 +155,16 @@ static WorldModel world4() throws Exception {
158155
void modelToGrid() {
159156
for (int i=0; i<GWidth; i++) {
160157
for (int j=0; j<GHeight-1; j++) {
161-
model.set(0, i, j);
158+
model.data[i][j] = 0;
162159
model.names[i][j] = "";
163160
}
164-
model.set(TABLE, i, GHeight-1);
161+
model.data[i][GHeight-1] = TABLE;
165162
model.names[i][GHeight-1] = "table";
166163
}
167164
int i=0;
168165
for (Stack<String> s : stackList) {
169166
for (int j=1; j<s.size(); j++) {
170-
model.set(BLOCK, i*2+1, GHeight-j-1);
167+
model.data[i*2+1][GHeight-j-1] = BLOCK;
171168
model.names[i*2+1][GHeight-j-1] = s.get(j);
172169
}
173170
i++;

jason-interpreter/src/main/java/jason/environment/grid/GridWorldModel.java

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package jason.environment.grid;
22

3-
import javax.swing.*;
43
import java.util.Random;
54

65

@@ -111,10 +110,7 @@ public int countObjects(int obj) {
111110

112111
public void set(int value, int x, int y) {
113112
data[x][y] = value;
114-
if (view != null) {
115-
final int ux = x, uy = y;
116-
SwingUtilities.invokeLater(() -> view.update(ux, uy));
117-
}
113+
if (view != null) view.update(x,y);
118114
}
119115

120116
public void add(int value, Location l) {
@@ -123,10 +119,7 @@ public void add(int value, Location l) {
123119

124120
public void add(int value, int x, int y) {
125121
data[x][y] |= value;
126-
if (view != null) {
127-
final int ux = x, uy = y;
128-
SwingUtilities.invokeLater(() -> view.update(ux, uy));
129-
}
122+
if (view != null) view.update(x,y);
130123
}
131124

132125
public void addWall(int x1, int y1, int x2, int y2) {
@@ -137,16 +130,13 @@ public void addWall(int x1, int y1, int x2, int y2) {
137130
}
138131
}
139132

140-
public void remove(int value, Location l) {
133+
public void remove(int value, Location l) {
141134
remove(value, l.x, l.y);
142135
}
143136

144137
public void remove(int value, int x, int y) {
145138
data[x][y] &= ~value;
146-
if (view != null) {
147-
final int ux = x, uy = y;
148-
SwingUtilities.invokeLater(() -> view.update(ux, uy));
149-
}
139+
if (view != null) view.update(x,y);
150140
}
151141

152142
public void removeAll(int value) {
Lines changed: 46 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
package jason.environment.grid;
22

3-
import java.awt.*;
4-
import java.awt.image.BufferedImage;
3+
import java.awt.BorderLayout;
4+
import java.awt.Canvas;
5+
import java.awt.Color;
6+
import java.awt.Font;
7+
import java.awt.FontMetrics;
8+
import java.awt.Graphics;
59

6-
import javax.swing.*;
10+
import javax.swing.JFrame;
711

812
/**
913
* View component for a GirdWorldModel.
@@ -19,8 +23,6 @@ public class GridWorldView extends JFrame {
1923

2024
protected GridCanvas drawArea;
2125
protected GridWorldModel model;
22-
protected BufferedImage backBuffer;
23-
private Graphics2D backG;
2426

2527
protected Font defaultFont = new Font("Arial", Font.BOLD, 10);
2628

@@ -44,25 +46,20 @@ public void repaint() {
4446
cellSizeW = drawArea.getWidth() / model.getWidth();
4547
cellSizeH = drawArea.getHeight() / model.getHeight();
4648
super.repaint();
49+
drawArea.repaint();
4750
}
4851

4952
/** updates all the frame */
5053
public void update() {
51-
ensureBackBuffer();
5254
repaint();
5355
}
5456

5557
/** updates only one position of the grid */
5658
public void update(int x, int y) {
57-
if (!SwingUtilities.isEventDispatchThread()) {
58-
// Only the event dispatch thread can update the GUI
59-
SwingUtilities.invokeLater(this::update);
60-
return;
61-
}
62-
63-
ensureBackBuffer();
64-
renderAllToBackBuffer();
65-
drawArea.repaint();
59+
Graphics g = drawArea.getGraphics();
60+
if (g == null) return;
61+
drawEmpty(g, x, y);
62+
draw(g, x, y);
6663
}
6764

6865
public void drawObstacle(Graphics g, int x, int y) {
@@ -103,7 +100,25 @@ public void draw(Graphics g, int x, int y, int object) {
103100
//drawString(g,x,y,defaultFont,String.valueOf(object));
104101
}
105102

106-
private static final int limit = (int)Math.pow(2,14);
103+
private static int limit = (int)Math.pow(2,14);
104+
105+
private void draw(Graphics g, int x, int y) {
106+
if ((model.data[x][y] & GridWorldModel.OBSTACLE) != 0) {
107+
drawObstacle(g, x, y);
108+
}
109+
110+
int vl = GridWorldModel.OBSTACLE*2; // the next object after OBSTACLE
111+
while (vl < limit) {
112+
if ((model.data[x][y] & vl) != 0) {
113+
draw(g, x, y, vl);
114+
}
115+
vl *= 2;
116+
}
117+
118+
if ((model.data[x][y] & GridWorldModel.AGENT) != 0) {
119+
drawAgent(drawArea.getGraphics(), x, y, Color.blue, model.getAgAtPos(x, y));
120+
}
121+
}
107122

108123
public Canvas getCanvas() {
109124
return drawArea;
@@ -115,73 +130,27 @@ public GridWorldModel getModel() {
115130

116131
class GridCanvas extends Canvas {
117132

118-
private static final long serialVersionUID = 2L;
119-
120-
@Override
121-
public void update(Graphics g) {
122-
paint(g);
123-
}
133+
private static final long serialVersionUID = 1L;
124134

125135
public void paint(Graphics g) {
126-
ensureBackBuffer();
127-
g.drawImage(backBuffer, 0, 0, this);
128-
Toolkit.getDefaultToolkit().sync();
129-
}
130-
}
131-
132-
private void ensureBackBuffer() {
133-
int w = Math.max(1, drawArea.getWidth());
134-
int h = Math.max(1, drawArea.getHeight());
135-
if (backBuffer == null || backBuffer.getWidth() != w || backBuffer.getHeight() != h) {
136-
if (backG != null) {
137-
backG.dispose();
136+
cellSizeW = drawArea.getWidth() / model.getWidth();
137+
cellSizeH = drawArea.getHeight() / model.getHeight();
138+
int mwidth = model.getWidth();
139+
int mheight = model.getHeight();
140+
141+
g.setColor(Color.lightGray);
142+
for (int l = 1; l <= mheight; l++) {
143+
g.drawLine(0, l * cellSizeH, mwidth * cellSizeW, l * cellSizeH);
138144
}
139-
backBuffer = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
140-
backG = backBuffer.createGraphics();
141-
backG.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
142-
}
143-
renderAllToBackBuffer();
144-
}
145-
146-
private void renderAllToBackBuffer() {
147-
cellSizeW = Math.max(1, backBuffer.getWidth() / model.getWidth());
148-
cellSizeH = Math.max(1, backBuffer.getHeight() / model.getHeight());
149-
150-
backG.setColor(Color.white);
151-
backG.fillRect(0, 0, backBuffer.getWidth(), backBuffer.getHeight());
152-
153-
backG.setColor(Color.lightGray);
154-
for (int l = 1; l <= backBuffer.getHeight(); l++) {
155-
backG.drawLine(0, l * cellSizeH, model.getWidth() * cellSizeW, l * cellSizeH);
156-
}
157-
for (int c = 1; c <= backBuffer.getWidth(); c++) {
158-
backG.drawLine(c * cellSizeW, 0, c * cellSizeW, model.getHeight() * cellSizeH);
159-
}
160-
161-
for (int x = 0; x < model.getWidth(); x++) {
162-
for (int y = 0; y < model.getHeight(); y++) {
163-
renderCell(backG, x, y);
145+
for (int c = 1; c <= mwidth; c++) {
146+
g.drawLine(c * cellSizeW, 0, c * cellSizeW, mheight * cellSizeH);
164147
}
165-
}
166-
}
167-
168-
private void renderCell(Graphics2D g, int x, int y) {
169-
drawEmpty(g, x, y);
170148

171-
if ((model.data[x][y] & GridWorldModel.OBSTACLE) != 0) {
172-
drawObstacle(g, x, y);
173-
}
174-
175-
int vl = GridWorldModel.OBSTACLE*2; // the next object after OBSTACLE
176-
while (vl < limit) {
177-
if ((model.data[x][y] & vl) != 0) {
178-
draw(g, x, y, vl);
149+
for (int x = 0; x < mwidth; x++) {
150+
for (int y = 0; y < mheight; y++) {
151+
draw(g,x,y);
152+
}
179153
}
180-
vl *= 2;
181-
}
182-
183-
if ((model.data[x][y] & GridWorldModel.AGENT) != 0) {
184-
drawAgent(g, x, y, Color.blue, model.getAgAtPos(x, y));
185154
}
186155
}
187156
}

0 commit comments

Comments
 (0)