问题描述
我正在使用滚动窗格,里面有一个JPanel,用于绘制一个方格网格,这些方块是来自[] []数组的对象。
I'm using a scroll pane, with a JPanel inside that draws a grid of squares that are objects from a [][] array.
如果是数组是[83] [81]大小为18 ^ 2的矩形看起来像:
(注意网格边缘的白色边框)
IF the array is [83][81] of size 18^2 rectangles it looks like: http://i.imgur.com/fwJ9LV6.png(Notice the white border at the edge of the grid)
然而,[84] [82]处的相同矩形]:(最后一行被切片)。
However, same rectangles at [84][82]: http://i.imgur.com/PZ2rNY3.png (The last rows get sliced).
现在,我已经:
- 增加首选和最大值滚动窗格和Jpanel的大小都远远高于所需的大小。
- 检查JPanel是可滚动对象的视口。
它没有改变任何东西。
我的Jpanel类是:
My Jpanel Class is:
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);
}
}
}
滚动窗格及相关,可以如果需要,发布整个GUI类:
Scroll pane and related, can post the entire GUI class if needed:
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)
);
虽然之前我已经完成了GUI,但是通过RAD环境和手动,可滚动界面都有点新给我!
While I've done GUI's before, both via RAD environments and by hand, scrollable interfaces are somewhat new to me!
推荐答案
BlastRadiusCanvas
需要提供回信息关于它想要多大的滚动窗格。
The BlastRadiusCanvas
needs to be providing information back to the scroll pane about how big it wants to be.
根据我对您尝试做的解释,尝试将以下内容添加到 BlastRadiusCanvas
Based on my interpretation of what it is your trying to do, try adding the following to your BlastRadiusCanvas
@Override
public Dimension getPreferredSize() {
return new Dimension((grid.getColumns() * 18) + 64, (grid.getRows() * 18) + 1);
}
现在真的,你不应该依赖魔法数字,它会最好使用类似的东西......
Now really, you shouldn't rely on "magic" numbers, it would be better to use something like...
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
方法看起来更像...
This would make your paintComponent
method look more like...
@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);
}
}
这篇关于JScrollPane没有滚动超过设定的大小的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!