标签: repaint

如何在JScrollPane上禁用轮滚动事件的默认绘制行为

我最近购买了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)

java swing java-2d repaint

5
推荐指数
1
解决办法
1558
查看次数

在WinForms中加速缓慢的CPU密集型滚动

如何在WinForms应用程序中加快UserControls的滚动速度.

我的主窗体在慢速机器上快速滚动很麻烦 - 每个小滚动增量的绘画都是CPU密集型的.

我的表单大约有五十个UserControls(有多个字段)一个位于另一个之下.我试图拦截OnScroll和UserPaint为了消除一些不必要的重新油漆的非常小的滚动事件,但潜在的油漆被称为反正.

如何在较慢的机器上简化滚动?

c# performance rendering repaint winforms

5
推荐指数
1
解决办法
2536
查看次数

在C#中,如何将刷新/重绘消息发送到WPF网格或画布?

如何将刷新消息发送到WPF网格或画布?

换句话说,我注意到在调试模式下,我可以编写代码向显示器发送一行,然后,如果该行不正确,我可以调整它 - 但前一行仍然存在.现在,我正在编写的代码根据用户点击的内容向显示器发送信息.因此,这必须意味着每次一组新的行和框和文本转到WPF中的网格或画布时,不会刷新显示.

使用C#代码,如何将刷新/重绘消息发送到WPF网格或画布?

c# wpf grid repaint

5
推荐指数
1
解决办法
6237
查看次数

.setVisible(true)立即重绘

在一个简短的方法中,我使用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)

java swing transparency visibility repaint

5
推荐指数
1
解决办法
7058
查看次数

Java Graphics重绘行为

我一直在我的代码中搜索这种行为的原因已有一段时间了.我不想深入了解Swing API以找出发生这种情况的原因.我很感激有关导致此问题的原因的任何信息.

这是我正在编写的应用程序的简化版本,问题似乎是当我第一次点击绘图时,图像不会在面板上绘制,但是当我第二次单击它时,它会完美地绘制图像.之后完成的任何绘图都能正常工作,但最初的绘画问题让我很烦.谢谢你的帮助!:)

public class ImageTester {

public static void main(String[] args) {
    final JFrame window = new JFrame("Image Tester");
    final JPanel pane = new JPanel();
    JButton draw = new JButton("Draw");
    JButton paint = new JButton("Paint");

    Toolkit k = Toolkit.getDefaultToolkit();
    final Image i = k.createImage("tester.jpg");
    //pane.getGraphics().drawImage(i, 22, 15, null);

    draw.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent arg0) {
            System.out.println(pane.getGraphics());
            pane.getGraphics().drawRect(5, 5, 15, 15);
            pane.getGraphics().drawImage(i, 15, 15, null);
            System.out.println("Performance");
        }
    });

    paint.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {

        }
    });

    pane.add(draw); …
Run Code Online (Sandbox Code Playgroud)

java graphics swing repaint draw

5
推荐指数
1
解决办法
1486
查看次数

在JPanel的一部分中绘制而不重新绘制其余部分

我正在尝试用Java创建一个Mastermind.代码并不是很难,但我希望有一个非常好的界面.我有一个JPanel,它占用了我所有的JFrame,我使用surchargind repaint()方法绘制了这个JPanel :

public void paint(Graphics g) //méthode permettant de dessiner les éléments sur la carte
   {
   super.paintComponents(g);
   Graphics gr;
   gr = MasterMindPane.getGraphics();

   img = MasterMindPane.getToolkit().getImage("images/plateau4-8.jpg");
   gr.drawImage(img, 0, 0, 600, 720, this);

   gr = bouleRougePane.getGraphics();
   img = bouleRougePane.getToolkit().getImage("images/bouleRouge.png");
   //gr.drawImage(img, 535, 303, 45, 45, this);
   gr.drawImage(img, 0, 0, 45, 45, this);
   gr = bouleOrangePane.getGraphics();
   img = bouleOrangePane.getToolkit().getImage("images/bouleOrange.png");
   //gr.drawImage(img, 535, 303, 45, 45, this);
   gr.drawImage(img, 0, 0, 45, 45, this);
}
Run Code Online (Sandbox Code Playgroud)

当我点击一个有Panel的图像时,我画出一个黄色圆圈:

private void bouleRougePaneMouseClicked(java.awt.event.MouseEvent evt) {                                            
   Graphics2D g2d = (Graphics2D) …
Run Code Online (Sandbox Code Playgroud)

java swing jpanel repaint

5
推荐指数
1
解决办法
3530
查看次数

repaint()无法工作

我想根据从另一个线程收到的数据在我的面板上绘制一个图像.我确信数据和随后的像素数组运行良好,但repaint()永远不会工作.谁能告诉我这里出了什么问题?

import javax.swing.*;
import java.awt.*;
import java.awt.image.*;

/** Create an image from a pixel array. **/
public class PicturePlaza extends JApplet
{
  ImagePanel fImagePanel;
  ReadCom   readComPort;
  Thread readPortThread;

  public void init () {
    // initiate the read port thread so that it can receive data
     readComPort = new ReadCom();
     readPortThread = new Thread(readComPort,"ReadCom");
     readPortThread.start();

     Container content_pane = getContentPane ();
     fImagePanel = new ImagePanel ();
     content_pane.add (fImagePanel);  

  } 

  // Tell the panel to create and display the image, if pixel data …
Run Code Online (Sandbox Code Playgroud)

java applet swing awt repaint

5
推荐指数
1
解决办法
432
查看次数

使用带有actionPerformed的repaint()方法

按下按钮时如何使用repaint()方法,Graphics p必须从头开始重新绘制所有内容?

谢谢.

  import javax.swing.Box;
  import javax.swing.JButton;
  import javax.swing.JTextField;
  import java.awt.*;
  import java.awt.event.*;
  import javax.swing.*;

  class fares extends JPanel{

    private static final long serialVersionUID = 1L;
    public static int xaxis1,xaxis2,yaxis3,yaxis4;

public ControlsB(square) {

    final JButton btn1 = new JButton("Resize");

    final Box b = Box.createHorizontalBox();
    b.add(new JLabel("Please enter range:  "));
    Box b0 = Box.createVerticalBox();//create a vertical box to stack the controls

    Box b1 = Box.createHorizontalBox(); // create a horizontal box for the x-axis

    //x-axis
    b1.add(new JLabel("mark "));
    b1.add(new JLabel("for"));

    f1.setMaximumSize(new Dimension(100,30)); …
Run Code Online (Sandbox Code Playgroud)

java swing repaint graphics2d japplet

5
推荐指数
2
解决办法
1万
查看次数

Java中的repaint()不会立即"重新绘制"?

我有这样的代码:

// In MyPanel.java
public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    // Draw something
    mypanel_count++;
}

// In Test.java
public void testLargeData()
{
    while (notDone)
    {
        panel.repaint();
        // do huge work
        test_count++;
        System.out.println("Test_count: " + test_count + ", MyPanel_count: " + mypanel_count);
    }
}

// Output !!!
Test_count: 752, MyPanel_count: 23
Test_count: 753, MyPanel_count: 23
Test_count: 754, MyPanel_count: 23
Test_count: 755, MyPanel_count: 24
Run Code Online (Sandbox Code Playgroud)

但是当我改变panel.repaint()panel.paintComponent(panel.getGraphics()),出局是正确的:

Test_count: 752, MyPanel_count: 752
Test_count: 753, MyPanel_count: 753
Test_count: 754, MyPanel_count: 754
Test_count: …
Run Code Online (Sandbox Code Playgroud)

java swing repaint paintcomponent

5
推荐指数
1
解决办法
2万
查看次数

在已经可见的帧上调用setVisible(true)

题:

在已经可见的JFrame上调用setVisible(true)有什么作用?我正在挖掘JFrame的源代码,最终,它归结为Component中的这个函数,如果它已经可见,它对框架什么都不做.它为什么表现得像revalidate(); repaint();?(见下面的SSCCE)


动机:

我正在开发一个java应用程序,为此我编写了一个JImagePanel扩展的类,JPanel允许用户将图像设置为背景(请参阅SSCCE).我发现在编辑了面板的背景后,我遇到了将背景重新绘制为正确尺寸的问题.在浏览互联网后,我发现以下工作:

if(frame.isVisible()) frame.setVisible(true);
Run Code Online (Sandbox Code Playgroud)

最终,我使用了解决了这个问题

panel.revalidate();
panel.repaint();
Run Code Online (Sandbox Code Playgroud)

我认为这是更好的解决方案,但它让我思考setVisible(true)在已经可见的框架上实际做了什么.从我的观点来看,它不应该起作用 - 但事实上确实如此.


SSCCE

这是一个说明我的问题的例子.如果没有别的,希望你将来发现这个课程非常有用.

注意:此文件的更新源可以在为其创建的项目的GitHub上的项目主页上找到.

请享用!

package com.dberm22.utils;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class JImagePanel extends JPanel {

    private static final long serialVersionUID = 6841876236948317038L;
    private Image img = null;
    private Position …
Run Code Online (Sandbox Code Playgroud)

java swing awt jpanel repaint

5
推荐指数
1
解决办法
2260
查看次数