【发布时间】:2012-05-16 04:51:20
【问题描述】:
如果您创建的 JScrollPane 的视口大于 JScrollPane 的组件,它会在左上角显示该组件。
有什么办法可以改变这种行为,让它显示组件居中?
下面的示例程序。
澄清:
我有一个 (width, height) = (cw,ch) 的组件。
我有一个带有 (width, height) = (vw, vh) 的视口的 JScrollPane。
组件可能会变大或变小。我想要一种使用滚动条来定位组件的中心点相对于视口中心点的方法,因此如果组件的一个或两个尺寸小于视口,则组件会显示在视口的中心。
默认的滚动窗格行为相对于视口的左上角定位组件的左上角。
我要问的是如何更改参考点。我不确定使用默认的 JScrollPane 做到这一点有多容易,所以如果这并不容易,那么我会学习我能做的并想出一种不同的方法。
package com.example.test.gui;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class SimpleScroller extends JFrame {
static class Thingy extends JPanel
{
private double size = 20.0;
@Override public Dimension getPreferredSize() {
int isize = (int) this.size;
return new Dimension(isize, isize);
}
@Override protected void paintComponent(Graphics g) {
super.paintComponent(g);
int[] x = {0, 100, 100, 0, 0, 75, 75, 25, 25, 50};
int[] y = {0, 0, 100, 100, 25, 25, 75, 75, 50, 50};
Graphics2D g2d = (Graphics2D) g;
AffineTransform at0 = g2d.getTransform();
g2d.scale(size/100, size/100);
g.drawPolyline(x, y, x.length);
g2d.setTransform(at0);
}
public void setThingySize(double size) {
this.size = size;
revalidate();
repaint();
}
public double getThingySize() { return this.size; }
}
public SimpleScroller(String title) {
super(title);
final Thingy thingy = new Thingy();
setLayout(new BorderLayout());
add(new JScrollPane(thingy), BorderLayout.CENTER);
final SpinnerNumberModel spmodel =
new SpinnerNumberModel(thingy.getThingySize(),
10.0, 2000.0, 10.0);
spmodel.addChangeListener(new ChangeListener() {
@Override public void stateChanged(ChangeEvent e) {
thingy.setThingySize((Double) spmodel.getNumber());
}
});
add(new JSpinner(spmodel), BorderLayout.NORTH);
}
public static void main(String[] args) {
new SimpleScroller("simple scroller").start();
}
private void start() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
setVisible(true);
}
}
【问题讨论】:
-
请务必张贴代码,用它来拉扯头发:-)。感谢上帝,因为“我没有拔头发(还)”,示例会很好,可以试一试,将不胜感激:-)
-
我还没有扯头发,你也不想让我发布我拥有的代码,但我可以举个例子。
-
你想在 JScrollPane 的中心画这条蛇
-
是的...虽然我很想知道如何随意放置它。
-
等等:不,我不想在 JScrollPane 的中心画螺旋线(你称之为“蛇”);我想绘制我的组件并将我的组件显示在 JScrollPane 的中心。
标签: java swing jscrollpane