mirror of
https://github.com/openjdk/jdk.git
synced 2026-04-29 08:05:14 +00:00
242 lines
8.4 KiB
Java
242 lines
8.4 KiB
Java
/*
|
|
*
|
|
* Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
*
|
|
* - Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
*
|
|
* - Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
*
|
|
* - Neither the name of Oracle nor the names of its
|
|
* contributors may be used to endorse or promote products derived
|
|
* from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
package java2d;
|
|
|
|
|
|
import static java.awt.Color.GRAY;
|
|
import static java.awt.Color.GREEN;
|
|
import static java.awt.Color.LIGHT_GRAY;
|
|
import static java.awt.Color.WHITE;
|
|
import java.awt.BasicStroke;
|
|
import java.awt.Color;
|
|
import java.awt.Component;
|
|
import java.awt.Dimension;
|
|
import java.awt.Font;
|
|
import java.awt.Frame;
|
|
import java.awt.GradientPaint;
|
|
import java.awt.Graphics;
|
|
import java.awt.Graphics2D;
|
|
import java.awt.GridLayout;
|
|
import java.awt.Image;
|
|
import java.awt.Rectangle;
|
|
import java.awt.TexturePaint;
|
|
import java.awt.event.MouseAdapter;
|
|
import java.awt.event.MouseEvent;
|
|
import java.awt.event.WindowAdapter;
|
|
import java.awt.event.WindowEvent;
|
|
import java.awt.font.FontRenderContext;
|
|
import java.awt.font.TextLayout;
|
|
import java.awt.geom.Ellipse2D;
|
|
import java.awt.image.BufferedImage;
|
|
import javax.swing.JPanel;
|
|
import javax.swing.border.EtchedBorder;
|
|
import javax.swing.border.TitledBorder;
|
|
|
|
|
|
/**
|
|
* Four types of Paint displayed: Geometry, Text & Image Textures and
|
|
* a Gradient Paint. Paints can be selected with the Mouse.
|
|
*/
|
|
@SuppressWarnings("serial")
|
|
public final class TextureChooser extends JPanel {
|
|
private final DemoInstVarsAccessor demoInstVars;
|
|
public Object texture = getGeomTexture();
|
|
public int num;
|
|
|
|
public TextureChooser(int num, DemoInstVarsAccessor demoInstVars) {
|
|
this.num = num;
|
|
this.demoInstVars = demoInstVars;
|
|
|
|
setLayout(new GridLayout(0, 2, 5, 5));
|
|
setBorder(new TitledBorder(new EtchedBorder(), "Texture Chooser"));
|
|
|
|
add(new Surface(getGeomTexture(), this, 0));
|
|
add(new Surface(getImageTexture(), this, 1));
|
|
add(new Surface(getTextTexture(), this, 2));
|
|
add(new Surface(getGradientPaint(), this, 3));
|
|
}
|
|
|
|
public static TexturePaint getGeomTexture() {
|
|
BufferedImage bi = new BufferedImage(5, 5, BufferedImage.TYPE_INT_RGB);
|
|
Graphics2D tG2 = bi.createGraphics();
|
|
tG2.setBackground(WHITE);
|
|
tG2.clearRect(0, 0, 5, 5);
|
|
tG2.setColor(new Color(211, 211, 211, 200));
|
|
tG2.fill(new Ellipse2D.Float(0, 0, 5, 5));
|
|
Rectangle r = new Rectangle(0, 0, 5, 5);
|
|
return new TexturePaint(bi, r);
|
|
}
|
|
|
|
public TexturePaint getImageTexture() {
|
|
Image img = DemoImages.getImage("globe.png", this);
|
|
int sw = img.getWidth(this);
|
|
int sh = img.getHeight(this);
|
|
int iw = sw/5;
|
|
int ih = sh/5;
|
|
BufferedImage bi =
|
|
new BufferedImage(iw, ih, BufferedImage.TYPE_INT_ARGB);
|
|
Graphics2D tG2 = bi.createGraphics();
|
|
tG2.drawImage(img, 0, 0, iw, ih, 0, 0, sw, sh, this);
|
|
Rectangle r = new Rectangle(0, 0, iw, ih);
|
|
return new TexturePaint(bi, r);
|
|
}
|
|
|
|
public TexturePaint getTextTexture() {
|
|
Font f = new Font(Font.SERIF, Font.BOLD, 10);
|
|
TextLayout tl = new TextLayout("OpenJDK", f, new FontRenderContext(null,
|
|
false, false));
|
|
int sw = (int) tl.getBounds().getWidth();
|
|
int sh = (int) (tl.getAscent() + tl.getDescent());
|
|
BufferedImage bi = new BufferedImage(sw, sh, BufferedImage.TYPE_INT_RGB);
|
|
Graphics2D tG2 = bi.createGraphics();
|
|
tG2.setBackground(WHITE);
|
|
tG2.clearRect(0, 0, sw, sh);
|
|
tG2.setColor(LIGHT_GRAY);
|
|
tl.draw(tG2, 0, tl.getAscent());
|
|
Rectangle r = new Rectangle(0, 0, sw, sh);
|
|
return new TexturePaint(bi, r);
|
|
}
|
|
|
|
public GradientPaint getGradientPaint() {
|
|
return new GradientPaint(0, 0, WHITE, 80, 0, GREEN);
|
|
}
|
|
|
|
|
|
public class Surface extends JPanel {
|
|
|
|
public boolean clickedFrame;
|
|
private int num;
|
|
private TextureChooser tc;
|
|
private boolean enterExitFrame = false;
|
|
private Object t;
|
|
|
|
public Surface(final Object t, final TextureChooser tc, int num) {
|
|
setBackground(WHITE);
|
|
this.t = t;
|
|
this.tc = tc;
|
|
this.clickedFrame = (num == tc.num);
|
|
this.num = num;
|
|
if (num == tc.num) {
|
|
tc.texture = t;
|
|
}
|
|
addMouseListener(new MouseAdapter() {
|
|
|
|
@Override
|
|
public void mouseClicked(MouseEvent e) {
|
|
tc.texture = t;
|
|
clickedFrame = true;
|
|
|
|
for (Component comp : tc.getComponents()) {
|
|
if (comp instanceof Surface) {
|
|
Surface surf = (Surface) comp;
|
|
if (!surf.equals(Surface.this) && surf.clickedFrame) {
|
|
surf.clickedFrame = false;
|
|
surf.repaint();
|
|
}
|
|
}
|
|
}
|
|
|
|
// ABP
|
|
if (demoInstVars.getControls().textureCB.isSelected()) {
|
|
demoInstVars.getControls().textureCB.doClick();
|
|
demoInstVars.getControls().textureCB.doClick();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void mouseEntered(MouseEvent e) {
|
|
enterExitFrame = true;
|
|
repaint();
|
|
}
|
|
|
|
@Override
|
|
public void mouseExited(MouseEvent e) {
|
|
enterExitFrame = false;
|
|
repaint();
|
|
}
|
|
});
|
|
}
|
|
|
|
@Override
|
|
public void paintComponent(Graphics g) {
|
|
super.paintComponent(g);
|
|
Graphics2D g2 = (Graphics2D) g;
|
|
int w = getSize().width;
|
|
int h = getSize().height;
|
|
if (t instanceof TexturePaint) {
|
|
g2.setPaint((TexturePaint) t);
|
|
} else {
|
|
g2.setPaint((GradientPaint) t);
|
|
}
|
|
g2.fill(new Rectangle(0, 0, w, h));
|
|
if (clickedFrame || enterExitFrame) {
|
|
g2.setColor(GRAY);
|
|
BasicStroke bs = new BasicStroke(3, BasicStroke.CAP_BUTT,
|
|
BasicStroke.JOIN_MITER);
|
|
g2.setStroke(bs);
|
|
g2.drawRect(0, 0, w - 1, h - 1);
|
|
tc.num = num;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public Dimension getMinimumSize() {
|
|
return getPreferredSize();
|
|
}
|
|
|
|
@Override
|
|
public Dimension getMaximumSize() {
|
|
return getPreferredSize();
|
|
}
|
|
|
|
@Override
|
|
public Dimension getPreferredSize() {
|
|
return new Dimension(30, 30);
|
|
}
|
|
}
|
|
|
|
public static void main(String[] s) {
|
|
Frame f = new Frame("J2D Demo - TextureChooser");
|
|
f.addWindowListener(new WindowAdapter() {
|
|
|
|
@Override
|
|
public void windowClosing(WindowEvent e) {
|
|
System.exit(0);
|
|
}
|
|
});
|
|
f.add("Center", new TextureChooser(0, new DemoInstVarsAccessorImplBase()));
|
|
f.pack();
|
|
f.setSize(new Dimension(400, 400));
|
|
f.setVisible(true);
|
|
}
|
|
}
|