我有一个加载图像的滚动窗格 . 我没有这个图像与她的自然大小,如果这个图像太大,我不会激活滚动条,但这个指令
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");
}
}
2 回答
JScrollPane
或更多的JViewport
将使用组件(或在本例中为"view's")首选大小作为确定视图应该有多大的基础 .当视图扩展超出滚动窗格的大小时,它将显示滚动条 .
所以基本上,你需要覆盖
public class Mappa extends JPanel {
面板的getPreferredSize
,例如这将鼓励
JViewport
始终与图像大小相同 .还有两件事......
首先,你不应该依赖魔术数字
应该更像......
其次,
会这样做,所以调用
clearRect
是没有意义的......您可能还想看一下Scrollable,但这是一个非常高级的主题
使用
JLabel
来包含图像并将其包装在JScrollPane
中应该可以轻松实现您想要的效果 . 从以下示例中获取提示: