【问题标题】:Insert images into JScrollPane and JScrollPane into JFrame将图像插入 JScrollPane 并将 JScrollPane 插入 JFrame
【发布时间】:2023-03-10 09:24:01
【问题描述】:

我需要一个显示许多图像的程序,并且我需要一个可以滚动的窗口。我阅读了文档并在论坛上进行了搜索,但我仍然没有设法做到这一点。我尝试使用 JScrollPane 和 JFrame,如下所示。

JScrollPane 类:

import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.*;

public class EmojiWindow extends JScrollPane {
    
    private void newImg(String emojiLocation, String emojiName) {
        JLabel emoji = new JLabel(new ImageIcon(emojiLocation));
        Emoji.setToolTipText(emojiName);
        add(emoji);
        
        Emoji.addMouseListener(new MouseListener(){
            public void mouseClicked(MouseEvent arg0) {}
            public void mouseEntered(MouseEvent arg0) {}
            public void mouseExited(MouseEvent arg0) {}
            public void mouseReleased(MouseEvent arg0) {}
            
            @Override
            public void mousePressed(MouseEvent e) {
                if(SwingUtilities.isLeftMouseButton(e))
                {
                    JFrame frame = new JFrame("new frame");
                    frame.setSize(300, 10);
                    frame.setVisible(true);
                }
            }
        });
    }

    public EmojiWindow(){
        newImg("fbike.png", "Riding a bike");
        newImg("fdizzy.png", "Dizzy");
        newImg("fcubehead.png", "Cube head");
        newImg("fhappy.png", "Happy");
    }
}

主要:

import java.awt.*;
import javax.swing.*;

public class Main {
    
    public static void main(String[] args)
    {
        EmojiWindow scrollPane = new EmojiWindow();
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        
        JFrame window = new JFrame();
        
        window.add(scrollPane, BorderLayout.SOUTH);
        window.setSize(300, 400);
        window.setVisible(true);
    }
}

编辑: 将变量和方法的名称更改为驼峰式以停止触发人。

【问题讨论】:

  • 将属性设置为 VERTICAL_SCROLLBAR_AS_NEEDED 用于水平滚动 HORIZONTAL_SCROLLBAR_AS_NEEDED 用于垂直滚动
  • 1) This answerJList 中显示JScrollPane 中的许多图像。它最适合大小相同的图像。虽然对于不同大小或较大的图像,我们可以实现 ListCellRenderer 将图像缩放到某个最大宽度和/或高度。 2) 请参阅The Use of Multiple JFrames, Good/Bad Practice? 3) // TODO Auto-generated method stub 在存在自动生成的代码之后,你能猜出你应该对这些 cmets 做什么吗?跨度>
  • .. 4) JFrame Window = new JFrame(); 请学习常见的 Java 命名法(命名约定 - 例如EachWordUpperCaseClassfirstWordLowerCaseMethod()firstWordLowerCaseAttribute,除非它是 UPPER_CASE_CONSTANT)并始终如一地使用它。此外,不要使用标准 API 的现有类的名称,将其命名为更具体的用途。这非常令人困惑。 5) 源代码中的一个空白行是永远需要的。 { 之后或} 之前的空行通常也是多余的。
  • .. 6) 而不是使用JLabel/MouseListener 组合。为了显示图像,我建议使用(可能未装饰)JButtonActionListener。默认情况下,按钮可以获得键盘焦点,并且动作侦听器将对鼠标键盘输入做出反应。

标签: java swing user-interface awt jscrollpane


【解决方案1】:

首先,学习并遵循 Java 命名约定。变量名不应以大写字符开头。您在此论坛或教科书中找到的任何示例都使用此约定。以身作则!!!

不要扩展 JScrollPane。没有必要这样做,因为您没有向类添加任何新功能。

另外,切勿将组件添加到 JScrollPane。单个组件被添加到滚动窗格的JViewPort

因此,在这种情况下,您将使用适当的布局管理器创建 JPanel。然后将面板添加到滚动窗格的视口中。

所以基本代码可能是这样的:

JPanel imagePanel = new JPanel();
imagePanel.add( label1 );
imagePanel.add( label2 );
...
JScrollPane scrollPane = new JScrollPane( imagePanel );
window.add( scrollPane );

阅读Swing Tutorial,了解所有 Swing 基础知识的工作示例。

编辑:

您也可以尝试Wrap Layout,当水平行已满时,它会导致组件换行到下一行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多