У меня есть это простое приложение, в котором команда, подобная RECT 10 20 100 150
, рисует прямоугольник с заданными аргументами на DrawPanel (расширяет JPanel
).
Также, после отрисовки примитива, он добавляет его к List<String> cmdList;
, так что в
paintComponent(Graphics g)
DrawPanel я перебираю список, обрабатываю каждую команду и рисую каждую из них.
Проблема, с которой сталкивается , заключается в том, что послеРисование нескольких фигур и изменение размера (или увеличение) панели становятся пустыми.И при повторном изменении размеров несколько раз все shpaes отображаются правильно.
Это скриншот после рисования нескольких примитивов.
После растяжения окна немного влево, примитивы исчезли.
Код для DrawPanel
public class DrawPanel extends JPanel {
private List<String> cmdList;
public final Map<String,Shape> shapes;
public DrawPanel()
{
shapes = new HashMap<String,Shape>();
shapes.put("CIRC", new Circ());
shapes.put("circ", new Circ());
shapes.put("RECT", new Rect());
shapes.put("rect", new Rect());
shapes.put("LINE", new Line());
//... and so on
cmdList = new ArrayList<String>();
}
public void addCmd(String s)
{
cmdList.add(s);
}
public void removeCmd()
{
cmdList.remove(cmdList.size());
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
setBackground(Color.BLACK);
for (int i = 0; i < cmdList.size(); ++i){
StringTokenizer cmdToken = new StringTokenizer(cmdList.get(i));
String cmdShape = cmdToken.nextToken();
int []args = new int[cmdToken.countTokens()];
for(int i1 = 0; cmdToken.hasMoreTokens(); i1++){
args[i1] = Integer.valueOf(cmdToken.nextToken());
}
shapes.get(cmdShape).draw(this, args);
}
}
public void getAndDraw(String cmdShape, int[] args)
{
shapes.get(cmdShape).draw(this, args);
}
public void rect(int x1, int y1, int width, int height)
{
Graphics g = getGraphics();
g.setColor(Color.BLUE);
g.drawRect(x1, y1, width, height);
}
public void circ(int cx, int cy, int radius)
{
Graphics g = getGraphics();
g.setColor(Color.CYAN);
g.drawOval(cx - radius, cy - radius, radius*2, radius*2);
}
}
Частичный код для Форма (Интерфейс)
public interface Shape {
void draw(DrawPanel dp, int[] data);
}
class Rect implements Shape {
public void draw(DrawPanel dp, int[] data) {
dp.rect(data[0], data[1], data[2], data[3]);
}
}
Линии, используемые в MainFrame (расширяет JFrame
) для рисования после ввода каждой команды.
drawPanel.getAndDraw(cmdShape, args);
drawPanel.addCmd(cmd);
Почему панель рисования, иногда рисование, а иногда нет, при изменении размера окна?
Как получить стабильный вывод?
Примечание. Если я что-то пропустил, спросите.