gpt4 book ai didi

java - JScrollPane 没有滚动超过设定的大小

转载 作者:行者123 更新时间:2023-11-29 09:55:19 24 4
gpt4 key购买 nike

我正在使用一个滚动 Pane ,里面有一个 JPanel,它绘制一个正方形网格,这些正方形是 [][] 数组中的对象。

如果数组是 [83][81],大小为 18^2 个矩形,它看起来像:http://i.imgur.com/fwJ9LV6.png(注意网格边缘的白色边框)

但是,[84][82] 处的相同矩形:http://i.imgur.com/PZ2rNY3.png (最后一行被切片)。

现在,我已经:

  • 将滚动 Pane 和 Jpanel 的首选大小和最大大小增加到远高于需要的大小。
  • 检查 JPanel 是否是可滚动对象的视口(viewport)。

它并没有改变任何东西。

我的 Jpanel 类是:

package BlastRadius;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JPanel;

/**
* Canvas Class Stuart Bradley 25-1-2013 Contains the paint component
*/
public class BlastRadiusCanvas extends JPanel {

GridOfNodes grid = new GridOfNodes();

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
RenderingHints rh = g2d.getRenderingHints();
rh.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHints(rh);

//Draw space
int pixelsAcross = 32;
int pixelsDown = 0;
int size = 18;
for (int i = 0; i < grid.getRows(); i++) {
for (int j = 0; j < grid.getColumns(); j++) {
g2d.setColor(grid.getNodeGrid()[i][j].getColour());
g2d.fillRect(pixelsAcross, pixelsDown, size, size);
g2d.setColor(new Color(0, 0, 0));
g2d.drawRect(pixelsAcross, pixelsDown, size, size);
//Better Ovals maybe needed, try Ellipise2D class

if (grid.getNodeGrid()[i][j].getHasOval() == true) {
g2d.setColor(new Color(255, 255, 255));
g2d.fillOval((pixelsAcross + (size / 2) - 1), (pixelsDown + (size / 2) - 1), size / 4, size / 4);
}
pixelsAcross += 18;
}
pixelsDown += 18;
pixelsAcross = 32;
//Draws gene string for first object in each row
g2d.setColor(new Color(0, 0, 0));
g2d.drawString(grid.getNodeGrid()[i][0].getGeneString(), 5, pixelsDown - 5);
}
}
}

滚动 Pane 和相关的,如果需要可以发布整个 GUI 类:

jScrollPane1 = new javax.swing.JScrollPane();
jScrollPane1.setPreferredSize(new java.awt.Dimension(10000, 10000));
jScrollPane1.setViewportView(drawingJPanel);

//Grouping

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 254, Short.MAX_VALUE)
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
);

虽然我以前通过 RAD 环境和手工完成过 GUI,但可滚动界面对我来说还是有些陌生!

最佳答案

BlastRadiusCanvas 需要向滚动 Pane 提供有关它希望有多大的信息。

enter image description here

根据我对您尝试执行的操作的解释,尝试将以下内容添加到您的 BlastRadiusCanvas

@Override
public Dimension getPreferredSize() {
return new Dimension((grid.getColumns() * 18) + 64, (grid.getRows() * 18) + 1);
}

现在真的,你不应该依赖“神奇”的数字,最好使用像...这样的东西

protected static final int GRID_SIZE = 18;
protected static final int H_GAP = 32;

@Override
public Dimension getPreferredSize() {
return new Dimension((grid.getColumns() * GRID_SIZE) + (H_GAP * 2), (grid.getRows() * GRID_SIZE) + 1);
}

这将使您的 paintComponent 方法看起来更像...

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
RenderingHints rh = g2d.getRenderingHints();
rh.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHints(rh);

//Draw space
int pixelsAcross = H_GAP;
int pixelsDown = 0;
int size = GRID_SIZE;
for (int i = 0; i < grid.getRows(); i++) {
for (int j = 0; j < grid.getColumns(); j++) {
g2d.setColor(grid.getNodeGrid()[i][j].getColour());
g2d.fillRect(pixelsAcross, pixelsDown, size, size);
g2d.setColor(new Color(0, 0, 0));
g2d.drawRect(pixelsAcross, pixelsDown, size, size);
//Better Ovals maybe needed, try Ellipise2D class

if (grid.getNodeGrid()[i][j].getHasOval() == true) {
g2d.setColor(new Color(255, 255, 255));
g2d.fillOval((pixelsAcross + (size / 2) - 1), (pixelsDown + (size / 2) - 1), size / 4, size / 4);
}
pixelsAcross += size;
}
pixelsDown += size;
pixelsAcross = H_GAP;
//Draws gene string for first object in each row
g2d.setColor(new Color(0, 0, 0));
g2d.drawString(grid.getNodeGrid()[i][0].getGeneString(), 5, pixelsDown - 5);
}
}

关于java - JScrollPane 没有滚动超过设定的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14574770/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com