【问题标题】:(3 Parts) Fixed Background, Other Elements Scrolling(3 部分) 固定背景,其他元素滚动
【发布时间】:2013-04-23 19:54:00
【问题描述】:

很抱歉提出这么愚蠢的问题,但我在将 Java 中的背景图像设置在固定图像上时遇到了一些问题。这就是我的意思-

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class MainFrame{

public static void createGUI(){
    JFrame frame = new JFrame("Warlords Organizer");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JLabel emptyLabel = new JLabel("");
    emptyLabel.setPreferredSize(new Dimension(1280,720));
    frame.getContentPane().add(emptyLabel, BorderLayout.CENTER);

    frame.pack();
    frame.setVisible(true);
    frame.setResizable(false);

    JLabel contentPane = new JLabel();
    contentPane.setIcon(/imageFolder/warlordsOrganizerBackground.png);
    contentPane.setLayout(new BorderLayout());
    frame.setContentPane(contentPane);


}

public static void main(String[] args) {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createGUI();
        }
    });
} // public static void main(String[] args) Closing
} // public class MainFrame Closing

所以我可以得到框架和类似的东西,但我似乎无法加载图像。我将图像放在名为 imageFolder 的源文件夹中 - http://i.imgur.com/LWqQ6JU.png

最后,当我向下滚动时,如何使背景图像保持在同一位置,但我计划添加的文本和其他图像移动?

【问题讨论】:

    标签: java image swing background


    【解决方案1】:
    contentPane.setIcon(/imageFolder/warlordsOrganizerBackground.png); // ????
    
    • 您必须将 Icon 对象传递给您的 setIcon(...) 方法。我不确定你在里面传递了什么,但它看起来像一个没有引号的字符串。
    • 您正在向容器 contentPane 添加组件,然后迅速将这个容器换成另一个容器。这样您就不会看到任何添加到 lame-duck 组件(旧的 contentPane)的组件。
    • 解决方案很明显:将组件添加到最终显示的 contentPane 中。
    • 还要确保为 JLabel 提供一个体面的布局管理器。
    • 要滚动图像,请在您的 JLabel/contentPane 上添加一个 JScrollPane,但使 JScrollPane 及其 JViewPort 不透明。

    例如:

    import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    
    import javax.imageio.ImageIO;
    import javax.swing.*;
    
    public class MainFrame {
    
       private static final String IMAGE_PATH = "imgFolder/ham-hamster.jpg";
    
       public static void createGUI() {
          JFrame frame = new JFrame("Fubars");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
          File imageFile = new File(IMAGE_PATH);
          try {
             JTextArea textArea = new JTextArea(5, 40);
             textArea.setWrapStyleWord(true);
             textArea.setLineWrap(true);
             for (int i = 0; i < 30; i++) {
                textArea.append("foo bars rule the world!\n");
             }
             textArea.setFont(textArea.getFont().deriveFont(Font.BOLD, 20));
             JScrollPane scrollPane = new JScrollPane(textArea);
             scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
             scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    
             textArea.setOpaque(false);
             scrollPane.setOpaque(false);
             scrollPane.getViewport().setOpaque(false);
    
             BufferedImage backgroundImg = ImageIO.read(imageFile);
             Icon backgroundIcon = new ImageIcon(backgroundImg);
             JLabel contentLabel = new JLabel(backgroundIcon);
             contentLabel.setLayout(new BorderLayout());
             contentLabel.add(scrollPane, BorderLayout.CENTER);
             frame.setContentPane(contentLabel);
             frame.pack();
             frame.setVisible(true);
          } catch (IOException e) {
             e.printStackTrace();
          }
    
       }
    
       public static void main(String[] args) {
          javax.swing.SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                createGUI();
             }
          });
       }
    } 
    

    显示为:

    【讨论】:

    • +1,我喜欢使用标签作为滚动窗格的容器,因为框架不可调整大小。
    • 哇,这真是太好了。首先,它是一个没有引号的字符串,这对我来说是多么愚蠢的错误。我也忘记了我没有使用旧的 contentPane。我不理解您的代码的主要部分是 JScrollPane。我现在会读下去。最后,什么是 e.printStackTrace(); ?
    • @Hathor:e.printStackTrace() 将任何来自异常的消息打印到标准错误输出中。
    【解决方案2】:

    有关如何加载图像的示例,请参阅 How to Use Icons

    如果您需要使用缩放图像作为背景,则可以使用Background Panel。它将为您设置滚动窗格和视口不透明。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-12
      • 2012-04-14
      • 2020-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-07
      相关资源
      最近更新 更多