[英]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.