我最近购买了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为了消除一些不必要的重新油漆的非常小的滚动事件,但潜在的油漆被称为反正.
如何在较慢的机器上简化滚动?
如何将刷新消息发送到WPF网格或画布?
换句话说,我注意到在调试模式下,我可以编写代码向显示器发送一行,然后,如果该行不正确,我可以调整它 - 但前一行仍然存在.现在,我正在编写的代码根据用户点击的内容向显示器发送信息.因此,这必须意味着每次一组新的行和框和文本转到WPF中的网格或画布时,不会刷新显示.
使用C#代码,如何将刷新/重绘消息发送到WPF网格或画布?
在一个简短的方法中,我使用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) 我一直在我的代码中搜索这种行为的原因已有一段时间了.我不想深入了解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创建一个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) 我想根据从另一个线程收到的数据在我的面板上绘制一个图像.我确信数据和随后的像素数组运行良好,但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) 按下按钮时如何使用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) 我有这样的代码:
// 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()),出局是正确的:
Run Code Online (Sandbox Code Playgroud)Test_count: 752, MyPanel_count: 752 Test_count: 753, MyPanel_count: 753 Test_count: 754, MyPanel_count: 754 Test_count: …
题:
在已经可见的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) repaint ×10
java ×8
swing ×8
awt ×2
c# ×2
jpanel ×2
applet ×1
draw ×1
graphics ×1
graphics2d ×1
grid ×1
japplet ×1
java-2d ×1
performance ×1
rendering ×1
transparency ×1
visibility ×1
winforms ×1
wpf ×1