相关疑难解决方法(0)

将组件绘制到BufferedImage会导致显示损坏

我正在使用这里JScrollNavigator描述的组件,以便为我嵌入的大型"画布式"CAD组件提供导航窗口.JScrollPane

我已经尝试调整JScrollNavigator绘制画布的缩略图以向用户提供一些额外的上下文.但是,执行此操作会导致应用程序主框架的呈现损坏.具体来说,它是调用paint(Graphics)视口组件(即我的主画布)的动作,传入由此Graphics创建的对象BufferedImage导致后续显示损坏; 如果我评论这一行,一切正常.

以下是JScrollNavigator被覆盖的paintComponent方法:

@Override
protected void paintComponent(Graphics g) {
    Component view = jScrollPane.getViewport().getView();
    BufferedImage img = new BufferedImage(view.getWidth(), view.getHeight(), BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2d = img.createGraphics();

    // Paint JScrollPane view to off-screen image and then scale.
    // It is this action that causes the display corruption!
    view.paint(g2d);
    g2d.drawImage(img, 0, 0, null);
    Image scaled = img.getScaledInstance(getWidth(), getHeight(), 0);

    super.paintComponent(g);
    g.drawImage(scaled, 0, 0, null);
}
Run Code Online (Sandbox Code Playgroud)

有没有人对腐败的原因有任何建议?我原本以为绘画到幕外图像应该对现有的绘画操作没有影响.

编辑 …

java swing bufferedimage awt java-2d

7
推荐指数
1
解决办法
1876
查看次数

JPanel重绘问题

我有一个JFrame,其中包含2个JPanel子类和BorderLayout中的2个JLabel.其中一个JPanel包含JButtons,另一个用于显示图形.JLabels位于北部和南部,西部是JPanel按钮,中间是JPanel.

显示JPanel需要不断刷新,所以我通过swing计时器生成的动作事件调用它的repaint()方法.我也覆盖它的paintComponent()方法来做我的绘图.

而不是显示我绘制的内容,"JFrame的内容"被绘制到显示JPanel上.我知道在完成绘图之前,我可以通过使用g.fillRect()或super.paintComponent()简单地"清除"显示JPanel.

我只是好奇为什么会这样.

我正在使用jdk 1.6u27.下面是我的代码:

package test;

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

public class Main {

public static void main(String[] args) {
    Simulation sim = new Simulation();

    }
}

class Simulation extends JFrame {

    public JLabel state;
    private JLabel id;
    private ButtonPanel control;
    private Display display;

    public Simulation() {
        id = new JLabel("Test");
        state = new JLabel("Test");
        control = new ButtonPanel();
        display = new Display(this);

        this.setLayout(new BorderLayout());
        this.add(id, BorderLayout.NORTH);
        this.add(control, BorderLayout.WEST);
        this.add(display, BorderLayout.CENTER);
        this.add(state, BorderLayout.SOUTH);

        this.setSize(500, …
Run Code Online (Sandbox Code Playgroud)

java swing jpanel jframe

6
推荐指数
1
解决办法
4168
查看次数

paintComponent正在执行两次

这困扰我,我的代码工作和运行但是当我去运行它时,它似乎循环我的for循环两次,任何人都可以帮助我的逻辑?谢谢...

package pkgcirc;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.*;

/*
* Notes:
* Draw 20 circles
* radius/location (x/y/r) all random
* if (circle) is between radii pt (step thru loop) of all values, if its within ,
*  draw it cyan if it overlaps, else black
*  
*/
public class Main extends JPanel {
    int[] radius = new int [3];
    int[] xArray = new int [3];
    int[] yArray = new int [3];

    public Main()
    {       
        Random g …
Run Code Online (Sandbox Code Playgroud)

java loops for-loop

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

标签 统计

java ×3

swing ×2

awt ×1

bufferedimage ×1

for-loop ×1

java-2d ×1

jframe ×1

jpanel ×1

loops ×1