[英]Java Swing - Cant add scrollbar to my panel
我正在尝试创建一个小型客户端,我可以在其中将坐标绘制到地图上。 我想首先将地图图像加载到 JPanel,然后将该面板添加到框架中。 图像非常大,因此您需要能够滚动才能看到所有图像。
但由于某种原因,我的滚动条不会出现。 我尝试了大多数指南,但它不起作用。
这是我的面板类:
public class MapPanel extends JPanel implements Pointable {
private static final long serialVersionUID = 1L;
private List<Shape> shapes = new LinkedList<>();
public MapPanel() {
Commander.getInstance().addShapeContainer(this);
shapeContainerState = NoState.getInstance();
MouseHandler mouseHandler = new MouseHandler(this);
KeyListener keyListener = new KeyListener();
this.addMouseListener(mouseHandler);
this.addMouseMotionListener(mouseHandler);
this.addKeyListener(keyListener);
this.setBackground(Color.white);
this.setFocusable(true);
this.requestFocusInWindow();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
BufferedImage image;
try {
image = ImageIO.read(new File("earthmap1.jpg"));
} catch (IOException e) {
throw new RuntimeException(e);
}
g.drawImage(image, 0, 0, null);
}
这是我的 JFrame 类:
public class MapFrame extends JFrame {
public MapFrame() {
buildTheUI();
setUpEventHandling();
mapPanel = new MapPanel();
JScrollPane scrollPane = new JScrollPane(mapPanel);
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(900, 800);
this.add(scrollPane);
this.setVisible(true);
}
}
图像显示良好,如果我放大窗口,您可以看到更多内容(因为所有内容都没有显示),但没有滚动条,所以我可以通过滚动查看图像的其余部分。
您的问题是由于 JPanel 的首选尺寸 - 它需要与图像的尺寸相匹配。 我建议覆盖public Dimension getPreferredSize()
方法并返回与图像大小匹配的维度。
附带问题:不要在诸如paintComponent之类的绘画方法中读入图像。 这些方法有助于确定程序的感知响应能力,并且需要尽可能快。 更重要的是,没有理由在每次 JPanel 重新绘制时重新读取图像,而是读取一次图像,例如在类的构造函数中。
例如,
public class MapPanel extends JPanel implements Pointable {
private static final long serialVersionUID = 1L;
private List<Shape> shapes = new LinkedList<>();
private BufferedImage image = null;
public MapPanel() throws IOException {
Commander.getInstance().addShapeContainer(this);
shapeContainerState = NoState.getInstance();
MouseHandler mouseHandler = new MouseHandler(this);
KeyListener keyListener = new KeyListener();
this.addMouseListener(mouseHandler);
this.addMouseMotionListener(mouseHandler);
this.addKeyListener(keyListener);
this.setBackground(Color.white);
this.setFocusable(true);
this.requestFocusInWindow();
image = ImageIO.read(new File("earthmap1.jpg"));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (image != null) {
g.drawImage(image, 0, 0, null);
}
}
@Override
public Dimension getPreferredSize() {
if (image == null) {
return super.getPreferredSize();
} else {
int w = image.getWidth();
int h = image.getHeight();
return new Dimension(w, h);
}
}
}
注意:代码未经测试
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.