gpt4 book ai didi

java - Swing:创建一个以组件为中心显示的 JScrollPane?

转载 作者:搜寻专家 更新时间:2023-10-30 21:19:33 25 4
gpt4 key购买 nike

如果您创建的 JScrollPane 的视口(viewport)大于 JScrollPane 的组件,它会在左上角显示该组件。

有什么方法可以改变这种行为,使组件居中显示?

下面的示例程序。


澄清:

我有一个组件,其 (width, height) = (cw,ch)。

我有一个 JScrollPane,其视口(viewport)具有 (width, height) = (vw, vh)。

组件可能会变大或变小。我想要一种使用滚动条相对于视口(viewport)中心点定位组件中心点的方法,因此如果一个或两个组件的尺寸小于视口(viewport),则该组件显示在视口(viewport)的中心。

默认的滚动 Pane 行为将组件的左上角相对于视口(viewport)的左上角定位。

我想问的是如何更改引用点。我不确定使用默认的 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);
}
}

最佳答案

  1. JPanel放入滚动面板
  2. 将面板的布局设置为 GridBagLayout
  3. 不受限制地将一个组件放入面板中。它将居中。

这是 Nested Layout Example 中使用的技术,它将红色/橙色图像置于父图像的中心。

关于java - Swing:创建一个以组件为中心显示的 JScrollPane?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10486171/

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