当前位置: 首页 > 知识库问答 >
问题:

Java ScrollPane和Canvas-将Canvas锁定为JScrollPane大小

朱越
2023-03-14

我的组件的布局如下:

JFrame(自定义类)->JScrollPane->Canvas

不确定这是否有帮助,但画布呈现代码如下:

//This is a method from a nested class inside the JFrame class.
public void run() {
    long MaxFrameTime;
    long Time;
            //This is the Canvas Object
    RXDisplayCanvas.createBufferStrategy(3);
    BufferStrategy BS = RXDisplayCanvas.getBufferStrategy();
    Graphics2D G2D;

    while(isVisible()){
        MaxFrameTime = Math.round(1000000000.0 / FPSLimit);
        Time = System.nanoTime();

        //Render Frame from a source from another thread via a AtomicReference<BufferedImage> named 'Ref'
        BufferedImage Frame = Ref.get();
        if(Frame != null){
            G2D = (Graphics2D)BS.getDrawGraphics();

            int X0 = 0;
            int Y0 = 0;
            int W = RXDisplayCanvas.getWidth();
            int H = RXDisplayCanvas.getHeight();
            double Width = Frame.getWidth();
            double Height = Frame.getHeight();
            double ImgW = Width;
            double ImgH = Height;

            if(ImgW > W){
                ImgW = W;
                ImgH = ImgW / (Width / Height);
            }

            if(ImgH > H){
                ImgH = H;
                ImgW = ImgH * (Width / Height);
            }

            int CenterX = (int)Math.round((W / 2.0) - (ImgW / 2.0)) + X0;
            int CenterY = (int)Math.round((H / 2.0) - (ImgH / 2.0)) + Y0;
            G2D.setBackground(Color.BLACK);
            G2D.clearRect(0, 0, W, H);
            G2D.drawImage(Frame, CenterX, CenterY, (int)Math.round(ImgW), (int)Math.round(ImgH), null);

            //Additional Drawing Stuff Here


            G2D.dispose();

            if(!BS.contentsLost()){
                BS.show();
            }
        }

        Time = System.nanoTime() - Time;
        if(Time < MaxFrameTime){
            try{
                Thread.sleep(Math.round((MaxFrameTime - Time)/1000000.0));
            }catch(InterruptedException N){}
        }
    }
}

我的问题的当前实现不太好用(没有用父JScrollPane“重新锁定”;“FixedDim”是以前设置的维度对象):

/**
 * Sets whether to lock the size of the canvas object to a predefined dimension.
 * @param b If true, the canvas becomes non-resizable and scrollbars will appear when appropriate. 
 * If false, the canvas will resize with the enclosing scrollpane.
 */
public void setLockResize(boolean b){
    CurrentlyLocked = b;
    if(b){
        RXDisplayCanvas.setMinimumSize(FixedDim);
        RXDisplayCanvas.setMaximumSize(FixedDim);
        RXDisplayCanvas.setPreferredSize(FixedDim);
    }else{
        RXDisplayCanvas.setMinimumSize(Min);
        RXDisplayCanvas.setMaximumSize(Max);
        RXDisplayCanvas.setPreferredSize(FixedDim);
    }
}

共有1个答案

许出野
2023-03-14

并废弃帆布的使用

Swing在默认情况下是双缓冲的。尝试使用JPanel。

我需要严格控制JScrollPane中子组件的大小,以便它要么锁定到JScrollPane的大小(这样就不会出现滚动条),要么保持固定到预定义的大小(并在适当的时候让JScrollPane显示滚动条)

 类似资料:
  • 问题内容: 我正在尝试实现自己的自定义SurfaceView,当其被触摸时,会在用户触摸屏幕的位置绘制一个圆圈。但是,当我打电话时,我得到了一个例外。每当画布锁定时,都会出现非法论点。示例代码发布在下面。 以下是我不断收到的错误日志: 帮助将不胜感激。 问题答案: 在画布上绘制后,需要将其解锁。正确的安全性是: 得到画布调用mSurfaceHolder.lockCanvas(); 在画布上画画。

  • Extends Composite Canvas is a widget that can be used to draw graphics using a canvas context. Import this type with “const {Canvas} = require('tabris');” Example: new Canvas({ left: 0, top: 0, righ

  • 描述 在 Weex 上依赖 gcanvas 在支付宝小程序中依赖 canvas 在 Web 和 Weex 中可以通过 ref 获取画布实例,在小程序中需要通过 createCanvasContext 和画布的 id 获取 canvas 上下文 安装 $ npm install rax-canvas --save 属性 属性 类型 默认值 必填 描述 支持 style Object - ✘ 通过内联

  • Canvas Mozilla 官方 <canvas> 教程在这里。 画布 <canvas> 的默认宽高为 300 与 150 ,但是同样可以使用 CSS 设定宽高。但因为 CSS 与 JavaScript 在渲染工程中有速度的差异,所以不建议使用 CSS 对 <canvas> 的宽高做设定。 <canvas width="300" height="150"> </canvas> 渲染上下文对象

  • 介绍 (Introduction) 画布控件表示一个矩形区域,应用程序可以绘制某些东西或者可以接收用户创建的输入。 类声明 以下是java.awt.Canvas类的声明: public class Canvas extends Component implements Accessible 类构造函数 SN 构造函数和描述 1 Canvas() 构造一个新的Canvas。 2

  • Canvas是一个矩形区域,用于绘制图片或其他复杂的布局。 您可以在Canvas上放置图形,文本,小部件或框架。 语法 (Syntax) 以下是创建此小部件的简单语法 - w = Canvas ( master, option=value, ... ) 参数 (Parameters) master - 这表示父窗口。 options - 以下是此小部件最常用的选项列表。 这些选项可用作以逗号分隔