java swing 组件渲染过程_java – Swing中的“原子渲染”

我有一个swing应用程序,在JScrollPane中包含一个SVG画布.

应用程序修改显示的SVG文档,这也会导致文档大小的更改.

此大小更改需要反映在应用程序中.调整SVG画布的大小并滚动JScrollPane的视口,以便显示画布的正确部分.

然而,这会导致像“视觉跳跃”之类的东西,因为用户首先看到画布大小的变化,然后看到滚动操作.

有没有办法告诉java停止处理给定组件(及其子组件)上的渲染事件,并且只有在我完成修改后才恢复,只显示所有修改的结果?

这是我在伪代码中的想法:

myScrollPane.suspendRendering();

svgDocument.changeSize();

svgCanvas.changeSize();

myScrollPane.getViewport().scrollToCorrectPosition;

myScrollPane.resumeRendering();

我尝试使用myScrollPane.setIgnoreRepaint(true),但它似乎没有任何效果(即使我再也没有将ignoreRepaint设置为false).

这是一个试图模拟效果的SSCCE:

import java.awt.BorderLayout;

import java.awt.Dimension;

import java.awt.Point;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JScrollPane;

import javax.swing.SwingUtilities;

public class Jumping extends JFrame {

private JButton innerPanel= new JButton("Some silly, useless text, just for fun. And it goes on even longer. But that's not a problem.");

private JScrollPane scrollPane= new JScrollPane(innerPanel);

private JButton btnJump= new JButton("Jump");

private int lastWidth= 1024;

public Jumping(){

this.setLayout(new BorderLayout());

this.add(btnJump, BorderLayout.NORTH);

this.add(scrollPane, BorderLayout.CENTER);

this.scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

this.scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

this.innerPanel.setPreferredSize(new Dimension(1024, 768));

this.innerPanel.setSize(1024, 768);

this.innerPanel.setMinimumSize(new Dimension(1024, 768));

this.innerPanel.setMaximumSize(new Dimension(1024, 768));

this.setSize(640, 480);

this.btnJump.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

try{

System.err.println("> actionPerfomed");

//resize the canvas

new Thread(){

public void run() {

System.err.println("> SwingWorker.doInBackground "+SwingUtilities.isEventDispatchThread());

SwingUtilities.invokeLater(new Runnable(){

public void run(){

System.err.println("> resize canvas "+SwingUtilities.isEventDispatchThread());

final int newWidth= (int) (lastWidth * 1.5);

innerPanel.setSize(newWidth, 768);

innerPanel.setPreferredSize(new Dimension(newWidth, 768));

innerPanel.setMinimumSize(new Dimension(newWidth, 768));

innerPanel.setMaximumSize(new Dimension(newWidth, 768));

lastWidth= newWidth;

System.err.println("< resize canvas "+SwingUtilities.isEventDispatchThread());

}

});

//scroll to correct position

SwingUtilities.invokeLater(new Runnable(){

public void run(){

System.err.println("> scroll to pos "+SwingUtilities.isEventDispatchThread());

try {

System.err.println("< sleep "+SwingUtilities.isEventDispatchThread());

Thread.sleep(500);

System.err.println("> sleep "+SwingUtilities.isEventDispatchThread());

} catch (InterruptedException ex) {

ex.printStackTrace();

}

final Point viewPos= scrollPane.getViewport().getViewPosition();

scrollPane.getViewport().setViewPosition(new Point(viewPos.x + 50, viewPos.y));

System.err.println("< scroll to pos "+SwingUtilities.isEventDispatchThread());

}

});

System.err.println("< SwingWorker.doInBackground "+SwingUtilities.isEventDispatchThread());

}

}.start();

System.err.println("< actionPerfomed "+SwingUtilities.isEventDispatchThread());

}catch(Exception ex){

ex.printStackTrace();

}

}

});

}

public static void main(String[] args){

final Jumping frame= new Jumping();

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setVisible(true);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值