1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| public class DemoDessin extends JPanel {
private static final Color[] COLORS = {Color.BLUE, Color.GREEN, Color.YELLOW, Color.MAGENTA };
private Optional<IRenderer> rendererHandler = Optional.empty();
public DemoDessin() {
}
public void setRenderer(IRenderer renderer) {
this.rendererHandler = Optional.ofNullable(renderer);
repaint();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(getForeground());
rendererHandler.ifPresent(renderer-> renderer.draw((Graphics2D)g, getWidth(), getHeight()));
}
@FunctionalInterface
public static interface IRenderer {
void draw(Graphics2D g, int width, int height);
}
public static void main(String[] args) {
JFrame frame = new JFrame("Démo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DemoDessin panel = new DemoDessin();
panel.setForeground(Color.ORANGE);
panel.setBackground(Color.WHITE);
frame.add(panel);
JPanel buttonPanel = new JPanel();
frame.add(buttonPanel, BorderLayout.SOUTH);
final IRenderer drawOval = (g,w,h)-> g.fillOval(10,10,w-20,h-20);
final IRenderer drawSquare = (g,w,h)-> g.fillRect(10,10,w-20,h-20);
final IRenderer drawDiamond = (g,w,h)-> fillDiamond(g,10,10,w-20,h-20);
buttonPanel.add(createButton("Cercle", e-> panel.setRenderer(drawOval) ));
buttonPanel.add(createButton("Carré", e-> panel.setRenderer(drawSquare) ));
buttonPanel.add(createButton("Losange", e-> panel.setRenderer(drawDiamond) ));
AtomicInteger index = new AtomicInteger();
buttonPanel.add(createButton("Défiler", e-> panel.setRenderer(getNext(index, drawOval, drawSquare, drawDiamond)) ));
frame.setSize(400, 300);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private static IRenderer getNext(AtomicInteger index, IRenderer...renderers) {
int i=index.getAndIncrement();
return (g,w,h)-> {
g.setColor(COLORS[i%COLORS.length]);
renderers[i%renderers.length].draw(g, w, h);
};
}
private static void fillDiamond(Graphics2D g, int x, int y, int w, int h) {
Polygon polygon = new Polygon(new int[]{x,x+w/2,x+w,x+w/2},
new int[]{y+h/2,y,y+h/2,y+h},
4);
g.fill(polygon);
}
private static JButton createButton(String text, ActionListener listener) {
JButton button = new JButton(text);
button.addActionListener(listener);
return button;
}
} |
Partager