我使用java重绘方法,它重新绘制,但只有当我点击画布或调整面板大小时才会看到更新.我怎样才能解决这个问题 ?是什么导致的?
我最近购买了Filthy Rich Clients这本书,我发现它非常有用和有趣.在本书的一个例子的基础上,我尝试实现一个自定义ScrollPane,它在要显示的组件的视图底部显示一个"阴影".我最终得到了下面的代码.它工作但不完美.特别是当我通过拖动滚动条滚动窗格时,一切正常,绘画非常流畅.但是当我用鼠标滚动滚动时,阴影闪烁,我不明白为什么.谁能帮我?
编辑:滚动窗格中的任何组件都会发生同样的事情.编辑代码以显示两个帧以查看问题.
编辑2:我已将问题与滚动窗格处理鼠标滚轮事件的方式隔离开来.滚动滚动窗格时,根据滚动的方向稍微向上或向下复制视口的内容,然后绘制进入视图的区域.我的代码使整个组件"脏"但是在组件移动了内容之后.所以你会立刻看到"影子"渐变不合适,直到发出重画.有关如何禁用此功能的任何想法?
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Container;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.RepaintManager;
public class Test {
public static void main(String[] args) {
JFrame f = new JFrame("Table");
JFrame f1 = new JFrame("Text Area");
Object[] names = new Object[] { "Title", "Artist", "Album" };
String[][] data = new String[][] {
{ "Los Angeles", "Sugarcult", "Lights Out" },
{ …Run Code Online (Sandbox Code Playgroud) 如何在WinForms应用程序中加快UserControls的滚动速度.
我的主窗体在慢速机器上快速滚动很麻烦 - 每个小滚动增量的绘画都是CPU密集型的.
我的表单大约有五十个UserControls(有多个字段)一个位于另一个之下.我试图拦截OnScroll和UserPaint为了消除一些不必要的重新油漆的非常小的滚动事件,但潜在的油漆被称为反正.
如何在较慢的机器上简化滚动?
在一个简短的方法中,我使用setVisible(false)隐藏JFrame.然后我截取屏幕截图并使用setVisible(true)恢复JFrame.
在再次显示之后,窗口应该显示与之前不同的图片(假设拍摄截图的一部分).
问题是在调用setVisible(true)之后,在调用paintComponent并绘制更新状态之前,窗口会使用旧内容闪烁一瞬间.
我可能会以一种丑陋的方式解决这个问题,但我想知道是否有更好的解决方案.
在此先感谢您的帮助
编辑:在准备一个例子的时候,我注意到,当我不在程序中使用透明度时几乎看不到效果.应该提到这一点.这是我想出的:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.JPanel;
import com.sun.awt.AWTUtilities;
public class Test {
static boolean flag = false;
static Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize();
public static void main(String[] args) throws InterruptedException {
JFrame frame = new JFrame();
frame.setUndecorated(true);
AWTUtilities.setWindowOpaque(frame, false); //draw on a transparent window
frame.setSize(scrSize.width, scrSize.height);
frame.setContentPane(new JPanel() {
protected void paintComponent(Graphics g)
{
if (Test.flag) {
g.setColor(Color.RED);
g.drawRect(50, 50, scrSize.width - 100, scrSize.height - 100);
}
else { …Run Code Online (Sandbox Code Playgroud) 我正在编写一个应用程序,它有一个JLayeredPane(称之为图层),包含两个不同层的JPanel.我覆盖了底部JPanel的paintComponent方法(称之为grid_panel),因此它绘制了一个网格,并在顶部绘制了一个paintComponent方法(称之为circuit_panel),因此它绘制了一个电路.
以下是结构摘要:
layers -
|-circuit_panel (on top)
|-grid_panel (at bottom)
Run Code Online (Sandbox Code Playgroud)
我希望grid_panel保持静态,即不进行任何重绘(除了初始的重绘),因为它不会改变.
麻烦的是,每当我调用circuit_panel.repaint()时,grid_panel也会被重新绘制! 这绝对不是有效的.
我认为这是由于JLayeredPane的热切绘画行为.有没有办法在JLayeredPane中禁用此功能?
如果你有兴趣看到上述效果,我写了一个小的演示程序:
public class Test2 extends JFrame {
public Test2() {
JLayeredPane layers = new JLayeredPane();
layers.setPreferredSize(new Dimension(600, 400));
MyPanel1 myPanel1 = new MyPanel1();
MyPanel2 myPanel2 = new MyPanel2();
myPanel1.setSize(600, 400);
myPanel2.setSize(600, 400);
myPanel1.setOpaque(false);
myPanel2.setOpaque(false);
myPanel2.addMouseListener(new MyMouseListener(myPanel2));
layers.add(myPanel1, new Integer(100)); // At bottom
layers.add(myPanel2, new Integer(101)); // On top
this.getContentPane().add(layers, BorderLayout.CENTER);
this.setSize(600, 400);
}
class MyPanel1 extends JPanel {
Color getRandomColor() {
int r = (int) …Run Code Online (Sandbox Code Playgroud) 我正在玩Java图形类,我只是想知道 - 何时需要调用该方法repaint()?我试着将它评论出来,但它似乎并没有影响我的输出GUI.我已经看到它在我阅读过的Java GUI代码中使用了很多.有人会介意何时使用它以及何时不使用它?
这是 JFrame
package client.connection;
import java.awt.Dimension;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import javax.swing.JFrame;
class DrawFrameRemoteControl extends JFrame
{
private DrawPanelRemoteControl imagePanel;
private ClientRemoteControlConnection clientRemoteControlConnection;
private ObjectInputStream clientInputStream;
private ObjectOutputStream clientOutputStream;
private Dimension imageDimension;
private Dimension serverDimension;
public DrawFrameRemoteControl(Dimension imageDimension,ClientRemoteControlConnection clientRemoteControlConnection,ObjectInputStream clientInputStream,ObjectOutputStream clientOutputStream,Dimension serverDimension)
{
super("Remote Desktop Control");
this.clientRemoteControlConnection=clientRemoteControlConnection;
this.clientInputStream=clientInputStream;
this.clientOutputStream=clientOutputStream;
this.imageDimension=imageDimension;
this.serverDimension=serverDimension;
imagePanel=new DrawPanelRemoteControl(imageDimension);
add(imagePanel);
setSize(imageDimension.width,imageDimension.height);
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
setLocationRelativeTo(null);
}
void drawNewImageGrayscale(byte[] array)
{
imagePanel.setNewImageGrayscale(array);
imagePanel.repaint();
}
}
Run Code Online (Sandbox Code Playgroud)
这是扩展的JPanel类 -
package client.connection;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit; …Run Code Online (Sandbox Code Playgroud) 我试图了解何时使用revalidate/repaint/pack.
令人惊讶的是,我没有找到更详细的引擎盖文档(随意链接).
到目前为止,我已经明白这是RepaintManager的全部责任.
这篇关于Oracle的文章解释说,调用重绘会在Event Dispatcher Thread上排队一个作业,该作业将在组件上调用paintImmediately()(这会重绘组件).
此跟踪表示要生效或不生效与LayoutManager相关联.而这完全取决于组件的大小而不是内容.
你可以在这里看到这个工作/打破:http://new.campchampions.com/parents
这个问题只出现在IE10中.在用户滚动了一些方法之后,导航变得固定(一类fixed添加到body其中的效果hgroup.primary(我知道,我知道hgroup不再是'东西'了.不要判断我.)).如果你回到页面顶部,它会解锁,恢复正常.
在IE10中,当您返回到页面顶部时,导航元素将消失,直到鼠标向上移动到黄色条的任何部分.这让我疯了.
我尝试过让JS在滚动顶部/取消固定导航的各种元素中附加/更改内容.
我有一个简短的YouTube视频,显示了这个问题:http://youtu.be/-itTC_j-9YE
有什么想法或想法吗?那简直太好了.谢谢!
我一直在开发一种乐谱软件,我想用它来训练我的音乐学生视奏。
我想知道我是否采取了正确的方法,或者是否有更好的方法。
我已经设法使用支持乐谱的 unicodes 和字体使用如下代码制作谱号、音符和谱表对象:
public static void spaceStaff(Graphics g){
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
Font font = new Font("Bravura", Font.PLAIN, 32);
g2.setFont(font);
g2.drawString("\uD834\uDD1A", note.spacing-2, staffDistance);
note.spacing = note.spacing + 16;
}
Run Code Online (Sandbox Code Playgroud)
然后我有一个名为 Surface 的类,它将笔记绘制到 JPanel 上:
public class Surface extends JPanel {
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
staff.spaceStaff(g);
clef.drawGclef(g);//not given in example code above
note.drawCrotchet(g, note.B1);//not given in example code above
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用此代码启动应用程序并显示音乐笔记:
public class SightreadHelper extends JFrame {
public SightreadHelper(){
initUI();
}
private void …Run Code Online (Sandbox Code Playgroud)