現在、JScrollPane と子コンポーネントに関するジレンマに悩まされています。本質的には、JScrollPane 内の子コンポーネントのサイズ変更を厳密に制御して、JScrollPane のサイズにロックする (スクロールバーが表示されないようにする) か、事前定義されたサイズに固定したままにする (必要に応じて JScrollPane にスクロールバーを表示させる) 必要があります。 . このコントロールは、動的に切り替えることができる必要があります (具体的には、別の JFrame ウィンドウのトグルボックスによって)。JScrollPane は、親 JFrame ウィンドウにロックされます (完全に塗りつぶされ、BorderLayout を介してサイズ変更にロックされます)。
現時点では、トリプル バッファリング機能 (createBufferStrategy(3);) により、Canvas オブジェクトを JScrollPane の子コンポーネントとして使用しています。Canvas と JScrollPane がうまく混ざり合わないことを多くの場所で見てきました。そのため、上記の問題を修正し、Canvas の使用を廃止できる回答をいただければ幸いです。
私のコンポーネントのレイアウトは次のとおりです。
JFrame (カスタム クラス) -> JScrollPane -> Canvas
これが役立つかどうかはわかりませんが、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);
}
}