Java 如果将Swing Intellij GUIDesigner映像放置在JScrollPane中,则该映像将消失

Java 如果将Swing Intellij GUIDesigner映像放置在JScrollPane中,则该映像将消失,java,swing,intellij-idea,jpanel,Java,Swing,Intellij Idea,Jpanel,我用的是IntelliJ GUIDesigner。 我有一个包含JPanel的JScrollPanel 我的想法是,我想将图像添加到JPanel中,并以全尺寸加载它,这样我就可以使用滚动条四处移动并查看整个图像 我的问题是,如果我不改变JPanel的大小,它本身就可以正常绘制。但在我改变JPanel大小的那一刻,它只是将自己重新绘制到原始状态(我想IntelliJ对我隐藏了很多代码) 代码是: private JPanel panel1; private JButton button1; pri

我用的是IntelliJ GUIDesigner。 我有一个包含JPanel的JScrollPanel

我的想法是,我想将图像添加到JPanel中,并以全尺寸加载它,这样我就可以使用滚动条四处移动并查看整个图像

我的问题是,如果我不改变JPanel的大小,它本身就可以正常绘制。但在我改变JPanel大小的那一刻,它只是将自己重新绘制到原始状态(我想IntelliJ对我隐藏了很多代码)

代码是:

private JPanel panel1;
private JButton button1;
private JPanel drawingPanel;

public MainPanel(){
    button1.addActionListener(e -> {
        JFileChooser openFile = new JFileChooser();
        File chosenFile;

        if(openFile.showSaveDialog(panel1) == JFileChooser.APPROVE_OPTION){
            chosenFile = openFile.getSelectedFile();
            drawImage(chosenFile);
        }
    });
}

private void drawImage(File file){
    try {
        BufferedImage image = ImageIO.read(file);
        //Works OK if line belowed is removed, but doesn't adjust size so I can't scroll.
        drawingPanel.setSize(image.getWidth(), image.getHeight());
        Graphics g = drawingPanel.getGraphics();
        g.drawImage(image, 0, 0, null);
        drawingPanel.paintComponents(g);
    }
    catch (IOException e) {
        e.printStackTrace();
    }

}
正如我在评论中所写的,如果删除了评论下面的行,那么我可以加载图像,它显示OK,但它太大了,我看不到整个图像。 如果我加上这条线,它就会清除一切,而我什么也看不见

这是很重要的-我需要得到的图像显示在全尺寸。 我该怎么做

我有一个包含JPanel的JScrollPanel

不要做定制绘画


只需创建一个JLabel并将标签添加到滚动窗格的视口中。然后,当您想更改图像时,使用JLabel的
设置图标(…)
方法,标签将自动重新绘制,必要时会出现滚动条。

也许您可以共享IntelliJ GUI表单?否则,很难重现您所面临的滚动问题。如果不使用自定义绘制并使用建议的标签,您可以按如下方式进行滚动:

public class MainPanel {
    private static JFrame frame;
    private JPanel panel1;
    private JButton button1;
    private JPanel drawingPanel;
    private JLabel drawingLabel;

    public static void main(String[] args) {
        MainPanel.test();
    }

    private static void test() {
        frame = new JFrame("");
        frame.setBounds(100, 100, 640, 480);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        new MainPanel();
        frame.setVisible(true);
    }

    public MainPanel() {
        initializeGui();
        button1.addActionListener(e -> {
            JFileChooser openFile = new JFileChooser("[...]");
            File chosenFile;

            if (openFile.showSaveDialog(panel1) == JFileChooser.APPROVE_OPTION) {
                chosenFile = openFile.getSelectedFile();
                System.out.println("chosenFile: " + chosenFile);
                drawImage(chosenFile);
            }
        });
    }

    private void initializeGui() {
        panel1 = new JPanel(new BorderLayout());
        frame.getContentPane().add(panel1);
        button1 = new JButton("Open image");
        panel1.add(button1, BorderLayout.NORTH);
        drawingPanel = new JPanel(new BorderLayout());
        panel1.add(drawingPanel, BorderLayout.CENTER);
        drawingLabel = new JLabel();
        drawingPanel.add(new JScrollPane(drawingLabel), BorderLayout.CENTER);
    }

    private void drawImage(File file){
        try {
            BufferedImage image = ImageIO.read(file);
            //Works OK if line below is removed, but doesn't adjust size so I can't scroll.
//            drawingPanel.setSize(image.getWidth(), image.getHeight());
//            Graphics g = drawingPanel.getGraphics();
//            g.drawImage(image, 0, 0, null);
//            drawingPanel.paintComponents(g);

            drawingLabel.setIcon(new ImageIcon(image));
            drawingPanel.validate();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
}

不确定用IntelliJ GUI设计器做类似的事情有多容易;我确实更喜欢IntelliJ(而不是Eclipse和NetBeans),但我也更喜欢用代码创建Java GUI…;-)

但事情就是这样。我需要做定制绘画。这是给大学的。这里有很多东西,其中之一就是如果图像比面板大,面板应该调整。我需要这样做。@user3212350,您的绘制代码是错误的,您从未直接调用绘制方法。您可以调用repaint()来告诉组件重新绘制自身。如果您确实需要进行自定义绘制,请阅读上的Swing教程中的部分以获取工作示例。关键是重写
getPreferredSize()
方法以返回图像的大小,以便正确确定面板的首选大小。是的,但这就是问题所在。IntelliJ不允许我在GUIDesigner中使用自定义类,或者我不知道如何做到这一点。我不能重写JPanel PaintComponent我确信该工具确实允许您重写方法,否则该工具将不会非常有用。这就是为什么我从不使用工具来创建GUI,所以我帮不了你。我宁愿花时间学习如何使用Java,而不是学习如何使用该工具。当您移动到Netbeans或Eclipse时会发生什么?这完全无关。工具是用来帮助生活的。我不想浪费时间在代码中做任何事情,这没有任何意义。我需要专注于真正重要的事情。这在IntelliJ中是不可能做到的,问题是我现在不知道如何做到这一点。