我有一个加载图像的滚动窗格。我不会用她的自然尺寸来看这个图像,如果这个图像太大,我不会激活滚动条,但是这个指令
g.drawImage(immagine, 0, 0, getWidth(), getHeight(), this);
用于放置在滚动窗格中的缩放图像。我该怎么办?
班贵:
import java.awt.*; import java.awt.event.*; import java.io.File; import javax.swing.*; public class Gui implements ActionListener { private JFrame frmEditor; private Mappa content; private JMenuItem mntmSfondo; private JScrollPane scrollabile; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { Gui window = new Gui(); window.frmEditor.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the application. */ public Gui() { initialize(); } /** * Initialize the contents of the frame. */ private void initialize() { frmEditor = new JFrame(); frmEditor.setFont(UIManager.getFont("TextArea.font")); frmEditor.setBounds(50, 50, 1024, 768); frmEditor.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frmEditor.getContentPane().setLayout(new BorderLayout(0, 0)); JPanel panelTile = new JPanel(); panelTile.setLayout(new BorderLayout(0, 0)); content = new Mappa(null); content.setMinimumSize(new Dimension(150, 150)); scrollabile = new JScrollPane(content); frmEditor.getContentPane().add(scrollabile, BorderLayout.CENTER); inizializzaMenu(); } /** * Initialize the menu. */ private void inizializzaMenu() { JMenuBar menuBar = new JMenuBar(); frmEditor.setJMenuBar(menuBar); JMenu mnAltro = new JMenu("Modify"); menuBar.add(mnAltro); mntmSfondo = new JMenuItem("Load Background"); mntmSfondo.addActionListener(this); mnAltro.add(mntmSfondo); } public void actionPerformed(ActionEvent e) { Object source = e.getSource(); if (source == mntmSfondo) { JFileChooser fc = new JFileChooser("tuttiSfondi"); int result = fc.showOpenDialog(null); if (result == JFileChooser.APPROVE_OPTION) { File file = fc.getSelectedFile(); try { content.setImage(file); //content = new Mappa(file); //scrollabile.setViewportView(content); } catch (Exception ex) { } } if (result == JFileChooser.CANCEL_OPTION) { } } } }
Mappa类:
import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; import javax.imageio.ImageIO; import javax.swing.*; public class Mappa extends JPanel { BufferedImage immagine; public Mappa(File fileImmagine) { if (fileImmagine != null ) { BufferedImage img = null; try { img = ImageIO.read(new File(fileImmagine.getPath())); } catch (IOException e) { e.printStackTrace(); } this.immagine = img; } repaint(); } public void setImage(File file) throws IOException { this.immagine = ImageIO.read(file); String name = file.getPath(); System.out.println(name); repaint(); } public void paintComponent(Graphics g) { super.paintComponent(g); g.clearRect(0, 0, 4000, 4000); g.drawImage(this.immagine, 0, 0, getWidth(), getHeight(), this); System.out.println("Called Repaint() on Mappa"); } }
答案 0 :(得分:2)
JScrollPane
或更多点JViewport
将使用组件(或在本例中为“视图”)首选大小作为确定视图大小的基础。
当视图扩展超出滚动窗格的大小时,它将显示滚动条。
基本上,您需要覆盖getPreferredSize
面板的public class Mappa extends JPanel {
,例如
public class Mappa extends JPanel {
//...
public Dimension getPreferredSize() {
return immagine == null ? new Dimension(200, 200) : new Dimension(immagine.getWidth(), immagine.getHeight());
}
//...
}
这会鼓励JViewport
始终与图片尺寸相同。
另外,有两件事......
首先,你不应该依赖幻数,例如
g.clearRect(0, 0, 4000, 4000);
应该更像......
g.clearRect(0, 0, getWidth(), getHeight());
其次,
super.paintComponent(g);
将以任何方式执行此操作,因此调用clearRect
有点毫无意义......
您可能还想看看Scrollable
,但这是一个非常高级的主题
答案 1 :(得分:1)
我不会以自然尺寸拍摄这张照片,如果这张照片也是如此 大,我不会激活滚动条,
使用JLabel
包含图片并将其包装在JScrollPane
中应该可以轻松实现您想要的效果。从以下示例中获取提示:
class AFrame extends JFrame
{
public AFrame()
{
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("Image view Demo with JScrollPane");
ImageIcon image = new ImageIcon("myImage.png"); // pass the file location of an image
JLabel label = new JLabel(image);
JScrollPane scrollPane = new JScrollPane(label);
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
add(scrollPane, BorderLayout.CENTER);
pack();
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new AFrame().setVisible(true);
}
});
}
}