由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Java版 - 问JavaFX的一个问题
相关主题
画图 LIBRARYA nice introduction to JavaFX
javafx2.2+已经可以直接打包成native了JavaFx language
JavaFX那个透明着色的问题现在居然这样了!JavaFX is actually quite powerful
how to get Frame from ActionEvent?Applet如何调用Server side Jar?
How to obtain frame id from ActionEvent? Thanksweb application一定要掌握javascript和ajax吗
Java 里划直线加粗的问题Let's tip hat for Sun's toll
JavaFX用第三方的package,出bug一般大家怎么解决?
JavaFX, anybody tried in real project?java已经不是第一了
相关话题的讨论汇总
话题: 透明话题: shape话题: canvas话题: y0话题: x0
进入Java版参与讨论
1 (共1页)
b***i
发帖数: 3043
1
我有两个Canvas,重叠显示。上面的透明部分可以让下面的透出来。
我现在要动态修改上方的,让原来不透明的一些点或者线变透明,怎么办?我知道如何
画有颜色的线,如下。但是画无色的线没有成功过。能否指点一二?
GraphicsContext gc = canvas.getGraphicsContext2D();
gc.setStroke(Color.BLUE);
gc.setLineWidth(5);
gc.strokeLine(x0, y0, x1, y1);// randome numbers
z****e
发帖数: 54598
b***i
发帖数: 3043
3
说个具体的吧。两个Canvas,上面的全黑,所以下面的不可见。现在需要在Canvas中间
打开一个扇形区域,让其透明,其实角度0,终止在60度,半径100个点。咋做?
你给的链接应该是填充一个矩形区域,我的目标是不规则区域,其实就是任意点,线,
和图形。

【在 z****e 的大作中提到】
: http://docs.oracle.com/javafx/2/api/javafx/scene/paint/LinearGr
z****e
发帖数: 54598
4
填充跟图形本身无关
你可以用来填充线或者圆形或者你想要什么图形都可以
问题在于,你如何画出这个图形来
如果是不规则的多边形
用polygon应该就可以了
以下是shape的实现类列表,找你喜欢的
Arc, Circle, CubicCurve, Ellipse, Line, Path, Polygon, Polyline, QuadCurve,
Rectangle, SVGPath, Text
z****e
发帖数: 54598
5
public abstract class Shape
extends Node
The Shape class provides definitions of common properties for objects that
represent some form of geometric shape. These properties include:
The Paint to be applied to the fillable interior of the shape (see setFill).
The Paint to be applied to stroke the outline of the shape (see setStroke).
The decorative properties of the stroke, including:
The width of the border stroke.
Whether the border is drawn as an exterior padding to the edges of the shape
, as an interior edging that follows the inside of the border, or as a wide
path that follows along the border straddling it equally both inside and
outside (see StrokeType).
Decoration styles for the joins between path segments and the unclosed ends
of paths.
Dashing attributes.
b***i
发帖数: 3043
6
如何把填充变成透明的?
如下代码在 new KeyFrame(Config.ANIMATION_TIME, new EventHandler
() {
public void handle(ActionEvent event) {
...
gc.setStroke(Color.BLUE);
gc.setLineWidth(5);
gc.strokeLine(x0, y0, x1, y1);
gc.setStroke(Color.rgb(255,255,255,0));
gc.strokeLine(x0+1, y0, x1+1, y1);
目的很简单,我画5点粗的线,然后设定为透明,重画一遍,但是移动一下,要替代掉
原来线段的大部分。可是结果是没有抹掉,线条还是原来那么粗。

,

【在 z****e 的大作中提到】
: 填充跟图形本身无关
: 你可以用来填充线或者圆形或者你想要什么图形都可以
: 问题在于,你如何画出这个图形来
: 如果是不规则的多边形
: 用polygon应该就可以了
: 以下是shape的实现类列表,找你喜欢的
: Arc, Circle, CubicCurve, Ellipse, Line, Path, Polygon, Polyline, QuadCurve,
: Rectangle, SVGPath, Text

z****e
发帖数: 54598
7
试试setFill
透明色直接用Color.TRANSPARENT
http://docs.oracle.com/javafx/2/api/javafx/scene/paint/Color.ht
我不是很看得明白你的代码,gc是什么?
能不能把代码贴全一点?

ActionEvent>

【在 b***i 的大作中提到】
: 如何把填充变成透明的?
: 如下代码在 new KeyFrame(Config.ANIMATION_TIME, new EventHandler
: () {
: public void handle(ActionEvent event) {
: ...
: gc.setStroke(Color.BLUE);
: gc.setLineWidth(5);
: gc.strokeLine(x0, y0, x1, y1);
: gc.setStroke(Color.rgb(255,255,255,0));
: gc.strokeLine(x0+1, y0, x1+1, y1);

b***i
发帖数: 3043
8
GraphicsContext gc = canvas.getGraphicsContext2D();
以Brick为模板,在initTimeline()里面
KeyFrame kf = new KeyFrame(Config.ANIMATION_TIME, new EventHandler<
ActionEvent>() {
public void handle(ActionEvent event) {
加入
GraphicsContext gc = canvas.getGraphicsContext2D();
int x0=random.nextInt(Config.SCREEN_WIDTH);
int y0=random.nextInt(Config.SCREEN_HEIGHT);
int x1=random.nextInt(Config.SCREEN_WIDTH);
int y1=random.nextInt(Config.SCREEN_HEIGHT);
gc.setStroke(Color.BLUE);
gc.setLineWidth(5);
gc.setFill(Color.BLUE);
gc.fillRect(x0, y0, 40, 40);
gc.setStroke(Color.TRANSPARENT);
gc.setFill(Color.TRANSPARENT);
gc.fillRect(x0+20, y0+20, 20, 20);
无法实现抠去一角的正方形
目的是
XXXXXXX
XXXXXXX
XXXX
XXXX

【在 z****e 的大作中提到】
: 试试setFill
: 透明色直接用Color.TRANSPARENT
: http://docs.oracle.com/javafx/2/api/javafx/scene/paint/Color.ht
: 我不是很看得明白你的代码,gc是什么?
: 能不能把代码贴全一点?
:
: ActionEvent>

z****e
发帖数: 54598
9
canvas啊
canvas你要自己处理脏数据
可能需要你介入repaint等方法去重新刷新整个页面
这个我没有怎么用过
以前javafx是不支持canvas的
后来新增的
我建议你这样
直接用shape下面的实现类
line或者polygone这些
然后直接setfill或者setstroke就好了

【在 b***i 的大作中提到】
: GraphicsContext gc = canvas.getGraphicsContext2D();
: 以Brick为模板,在initTimeline()里面
: KeyFrame kf = new KeyFrame(Config.ANIMATION_TIME, new EventHandler<
: ActionEvent>() {
: public void handle(ActionEvent event) {
: 加入
: GraphicsContext gc = canvas.getGraphicsContext2D();
: int x0=random.nextInt(Config.SCREEN_WIDTH);
: int y0=random.nextInt(Config.SCREEN_HEIGHT);
: int x1=random.nextInt(Config.SCREEN_WIDTH);

b***i
发帖数: 3043
10
不用repaint的。因为可以继续画上有颜色的方块,就是无法把任何地方变成透明的。

【在 z****e 的大作中提到】
: canvas啊
: canvas你要自己处理脏数据
: 可能需要你介入repaint等方法去重新刷新整个页面
: 这个我没有怎么用过
: 以前javafx是不支持canvas的
: 后来新增的
: 我建议你这样
: 直接用shape下面的实现类
: line或者polygone这些
: 然后直接setfill或者setstroke就好了

相关主题
Java 里划直线加粗的问题A nice introduction to JavaFX
JavaFXJavaFx language
JavaFX, anybody tried in real project?JavaFX is actually quite powerful
进入Java版参与讨论
z****e
发帖数: 54598
11
对阿,这就是你需要处理的脏数据
canvas我真心不熟,思维方式跟直接画shape不一样
建议你上shape,这样变化什么都更直观一点

【在 b***i 的大作中提到】
: 不用repaint的。因为可以继续画上有颜色的方块,就是无法把任何地方变成透明的。
b***i
发帖数: 3043
12
这么说吧,我写一个解释程序,里面有两个Canvas重叠,上面的如果有颜色可以遮住下
面的,让用户定义颜色,画直线,矩形,扇形,画文字都可以直接用JavaFX的api实现。
现在,用户定义透明色,结果画的矩形并没有把那个区域变成透明。得直接clearRect
。但是这样就不方便了,不能直接画透明的扇形,只能画矩形。Swing时代使用
AlphaComposite.SRC来实现画透明的形状,任何api都适用,drawLine, FillArc,
drawString。现在我要把上面Canvas上写的字变透明的,从而让下面的那个Canvas的背
景漏出来,总不能自己去重新发明轮子,一个点一个点画吧?

【在 z****e 的大作中提到】
: 对阿,这就是你需要处理的脏数据
: canvas我真心不熟,思维方式跟直接画shape不一样
: 建议你上shape,这样变化什么都更直观一点

z****e
发帖数: 54598
13
但是透明色怎么遮住下面的颜色呢?

现。
clearRect

【在 b***i 的大作中提到】
: 这么说吧,我写一个解释程序,里面有两个Canvas重叠,上面的如果有颜色可以遮住下
: 面的,让用户定义颜色,画直线,矩形,扇形,画文字都可以直接用JavaFX的api实现。
: 现在,用户定义透明色,结果画的矩形并没有把那个区域变成透明。得直接clearRect
: 。但是这样就不方便了,不能直接画透明的扇形,只能画矩形。Swing时代使用
: AlphaComposite.SRC来实现画透明的形状,任何api都适用,drawLine, FillArc,
: drawString。现在我要把上面Canvas上写的字变透明的,从而让下面的那个Canvas的背
: 景漏出来,总不能自己去重新发明轮子,一个点一个点画吧?

a*w
发帖数: 4495
14
用透明色就是要把下面的颜色露出来。

【在 z****e 的大作中提到】
: 但是透明色怎么遮住下面的颜色呢?
:
: 现。
: clearRect

z****e
发帖数: 54598
15
我知道楼主的意思
但是不能用透明色遮住下面的颜色
要挖空某一个部分才对

【在 a*w 的大作中提到】
: 用透明色就是要把下面的颜色露出来。
b***i
发帖数: 3043
16
Swing 的 JLayeredPane里面如果上面是JTextPane,下面是一个别的东西,JTextPane的
底色如果是透明的,就可以看到底下的。
透明其实就是挖空的,因为Color(0,0,0,0)本来就是Canvas的默认的填充颜色。不信你
可以生成一个Canvas,然后读出里面的点的颜色。只是Oracle似乎忘记了需要实现这些。

【在 z****e 的大作中提到】
: 我知道楼主的意思
: 但是不能用透明色遮住下面的颜色
: 要挖空某一个部分才对

z****e
发帖数: 54598
17
我知道你的意思阿
但是我觉得不应该挖空才对
你看阿
底色是白色
盖了一层蓝色
然后再盖了一层透明色
问:最后答案应该是什么颜色?
我觉得蓝色比较make sense

些。

【在 b***i 的大作中提到】
: Swing 的 JLayeredPane里面如果上面是JTextPane,下面是一个别的东西,JTextPane的
: 底色如果是透明的,就可以看到底下的。
: 透明其实就是挖空的,因为Color(0,0,0,0)本来就是Canvas的默认的填充颜色。不信你
: 可以生成一个Canvas,然后读出里面的点的颜色。只是Oracle似乎忘记了需要实现这些。

b***i
发帖数: 3043
18
盖透明色的时候,和盖其他颜色一样,要替代原来的点的颜色。这在Swing时代的
BufferedImage用
int compositeRule = AlphaComposite.SRC;//DST_OUT;
AlphaComposite composite =AlphaComposite.getInstance(compositeRule,
alphaValue);
而不是在原来点上根据新的点的alpha来决定是否画。不同Canvas叠在一起则上面的点
如果透明则漏出下面的点,这个时候,原则就是SRC_OVER。

【在 z****e 的大作中提到】
: 我知道你的意思阿
: 但是我觉得不应该挖空才对
: 你看阿
: 底色是白色
: 盖了一层蓝色
: 然后再盖了一层透明色
: 问:最后答案应该是什么颜色?
: 我觉得蓝色比较make sense
:
: 些。

1 (共1页)
进入Java版参与讨论
相关主题
java已经不是第一了How to obtain frame id from ActionEvent? Thanks
试了VaadinJava 里划直线加粗的问题
GWT + Spring ?JavaFX
Oracle收购Sun后 最新公布的产品策略,怀念SUNJavaFX, anybody tried in real project?
画图 LIBRARYA nice introduction to JavaFX
javafx2.2+已经可以直接打包成native了JavaFx language
JavaFX那个透明着色的问题现在居然这样了!JavaFX is actually quite powerful
how to get Frame from ActionEvent?Applet如何调用Server side Jar?
相关话题的讨论汇总
话题: 透明话题: shape话题: canvas话题: y0话题: x0