(抱歉英文不好)
我重新涂漆时的性能存在很大问题DataGridView
.
我正在使用a DataGridView
来显示来自外部应用程序流的日志.来自流的消息以高频率(小于1毫秒)进入.如果我DataGridView
在每条新消息到来时立即添加新行,DataGridView
则在下一条消息到来之前没有时间重新绘制自己.
一种可能的解决方案是使用队列来收集消息,并使用队列中的消息DataGridView
每100毫秒重新绘制一次.这很好但是DataGridView
当它自动滚动到最后一行时闪烁.(禁用平滑滚动)
你能帮助我改善DataGridView
表现吗?
所以我使用Paint的measureText()方法来测量一段文本的宽度,但我想根据特定的文本大小来测量文本.假设我想要获得文本片段的宽度,当它占用某个TextView时,它将是20个像素的像素.我尝试了以下方法:
Paint paint = new Paint();
paint.setTextSize(20);
paint.measureText("sample text");
Run Code Online (Sandbox Code Playgroud)
但是,它似乎没有起作用.我相信它会返回相对于较小文本大小的宽度.我觉得我错过的东西会让我在脸上拍打自己,然后大喊大叫.
我试图混合两个源RGB矢量来创建第三个"合成矢量",这是前两个的直观组合.
理想情况下,我可以模仿"真正的油漆混合特性",但为了简单起见,我试图找到一种方法,其结果看起来直观地像你从组合两个源rgb得到的结果.
最低限度,这些特征:
RED + BLACK =深红色
+白色=浅红色
最佳,也具有真正的油漆特性:
RED + BLUE =紫色
红色+黄色=橙色
(等)
-
我目前通过添加两个源RGB矢量/ 255,然后归一化(并乘以255)来做"懒惰的方式".所以,使用这个:[Red = <1,0,0>*255] + [Blue = <0,0,1>*255]给出Magenta = <1,0,1>/sqrt(2)*255,虽然其他颜色不太直观甚至不可见......我需要一个更好的方法!请帮忙 :-)
我正在尝试在OSX上创建一个带有Java的半透明窗口并添加一个JLabel
.
这JLabel
会每秒改变它的文字......
然而,该组件不能很好地重新粉刷.
我怎么解决这个问题?
如果可能的话,请粘贴修复源代码,这是我的:
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import java.awt.Color;
import java.awt.Font;
import java.util.Timer;
import java.util.TimerTask;
public class Translucent {
public static void main( String [] args ) {
JFrame frame = new JFrame();
frame.setBackground( new Color( 0.0f,0.0f,0.0f,0.3f));
final JLabel label = new JLabel("Hola");
label.setFont( new Font( label.getFont().getFamily(), Font.PLAIN, 46 ) );
label.setForeground( Color.white );
frame.add( label );
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible( true );
Timer timer = new …
Run Code Online (Sandbox Code Playgroud) 我正在研究如何编写支持撤消的绘制程序,并且很可能看到命令模式是我想要的.但是,有些东西仍然逃避了我,我希望有人可以提供一个简单的答案或确认.
基本上,如果我要体现撤消命令的能力,例如在屏幕上标记一个实心圆,这是否意味着我需要将圆覆盖的帧缓冲区本质复制到这个命令对象中?我没有看到任何其他方法可以撤消可能的内容,例如,标记一堆随机像素颜色.
我听说过一种方法只是跟踪前进动作,当执行撤消时,你只需从步骤1开始并向前绘制到撤消之前的步骤,但如果你要支持一个大的话,这似乎是不可行的撤消堆栈.
也许解决方案介于每个15-20个操作的位图之间,并从最后一个"保存"转发开始.
在这种情况下,有人可以提供有关典型接受方法的任何见解,可以在命令中保存缓冲区矩形,重做每个操作前进,还是我完全错过的东西?
更新:很多好的回应.感谢大家.我正在考虑我正在阅读的内容,我将通过每N次操作保存缓冲区以及当用户发出撤消命令重做来自最近保存的缓冲区的所有命令来解决此问题.我可以将N调整到尽可能高的值,这并不会显着降低需要响应式撤消的用户体验(为了最大限度地减少内存使用),但我怀疑此时并不确定,我应该是能够逃脱在一个框架中执行相当多的动作,这样做不是太糟糕.希望这种方法可以让我快速确定是否转向另一个方向,而不是为需要它的操作保存先前状态的位图rects.
我在Actionscript中创建了一个绘图应用程序(虽然我的问题不是与Actionscript相关).基本思想是在按下鼠标时开始绘画并跟踪鼠标移动.我想要的是:
现在,(1)是有问题的,因为我在几秒钟内就能获得数千个鼠标移动.由于(1)线条看起来很锯齿.当前的想法:当用户完成绘制线时,我将所有移动存储在一个数组中并减少它们(中位数阈值),然后使用样条算法重新创建一条线.
有更好的方法吗?
可以访问给定位图的alpha通道extractAlpha()
,但我无法找到任何方法来实际设置位图的alpha通道.
如何将多个灰度图像作为通道重新组合成Android的位图?
令我惊讶的是,我刚刚发现drawLine和drawRect不包括结束位置,即:
canvas.drawLine(100, 100, 100, 100, paint);
Run Code Online (Sandbox Code Playgroud)
要么
RectF rect = new RectF(100, 100, 100, 100);
canvas.drawRect(rect, paint);
Run Code Online (Sandbox Code Playgroud)
不会画任何东西.
我的油漆定义如下:
Paint paint = new Paint();
paint.setAntiAlias(false);
paint.setStyle(Paint.Style.FILL);
return paint;
Run Code Online (Sandbox Code Playgroud)
我已经尝试将我的绘画定义为FILL_AND_STROKE,但它无济于事.
Android的drawPaint()javadoc甚至没有列出stopX和stopY参数!
所以,如果我想绘制一条完全从beginY到endY(包括)的垂直线,我必须执行以下操作:
canvas.drawLine(constX, beginY, constX, endY + 1)
Run Code Online (Sandbox Code Playgroud)
请注意,我没有将1添加到结束X位置,仅添加到结尾Y(xstays与我想要的垂直线相同).
我的设备是HTC SENSE.
编辑:西蒙,你是对的,而不是问一个问题,我只是试图分享我的惊讶,因为Android在基本的绘图这样的基本情况下没有做文档所说的,并且确保我没有'在我的路上做任何愚蠢的错误.
为了让自己更清楚:drawRect的javadoc说:
public void drawRect(float left,float top,float right,float bottom,Paint paint)
使用指定的绘制绘制指定的Rect.矩形将根据绘画中的样式填充或加框.
left - 要绘制的矩形的左侧
top - 要绘制的矩形的顶边
right - 要绘制的矩形的右侧
bottom - 要绘制的矩形的底边
paint - 用于绘制rect的绘画
所以,写作时
canvas.drawRect(x1, y1, x2, y2)
Run Code Online (Sandbox Code Playgroud)
你期望一个角落在(x1,y1)的矩形; (x1,y2); (x2,y1)和(x2,y2).
Android说:错了!他们将在(x1,y1); (x1,y2-1); (x2-1,y1)和(x2-1,y2-1).
对于好奇的:设置画布剪辑:
canvas.clipRect(x1, y1, …
Run Code Online (Sandbox Code Playgroud) 正如这里所讨论的,当在Vista中调整Swing应用程序的大小(和Windows 7,这就是我正在使用的)时,右下角会出现黑色背景,而Swing的重绘会赶上更改.
使用其他应用程序(Windows资源管理器(本机),Firefox(C++?)和Eclipse(Java))我注意到它们都有同样的问题 - 与上面链接中的人说的相反 - 但它们通过以下方式将问题最小化具有灰色填充颜色,与Swing中出现的黑色相比,其视觉震撼性要小得多.
我想知道是否有一些方法可以改变这一点,以便Swing的行为与其他应用程序一样?我尝试设置JFrame的背景颜色,但无济于事.
其他信息 乔纳斯发现(见下面的信息性答案)这是JFrames的一个问题,但不是AWT框架 - 也许这会帮助有人解决这个问题.
我在Drawable
这里试验,发现了一些我无法解释的东西,希望有人可以帮助我.
为什么加入CornerPathEffect
到Paint
似乎"破"(?)的EVEN_ODD
FillType
?
更具体地说,我正在按原样测试这个HexagonDrawable
类.这就是我得到的:
但是,如果我设置CornerPathEffect
为Paint
,如下所示(构造函数)...
public HexagonDrawable(int color) {
paint.setColor(color);
paint.setPathEffect(new CornerPathEffect(6)); // added
hexagon.setFillType(Path.FillType.EVEN_ODD);
}
Run Code Online (Sandbox Code Playgroud)
......这就是我得到的:
圆角,是的,但没有轮廓的外观(奇数/偶数/奇数).有人可以解释一下原因吗?