【问题标题】:fixing JScrollPane with JLabel使用 JLabel 修复 JScrollPane
【发布时间】:2017-01-21 09:47:13
【问题描述】:

为了添加背景图像,我使用 JLabels 而不是 JPanel。

    JFrame frame=new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JLabel label=new JLabel(new ImageIcon("bg.png"));
    label.setLayout(new BoxLayout(label, BoxLayout.Y_AXIS));
    for(int i=0;i<20;i++)
         label.add(new JLabel(i.toString()));
    frame.add(label);

这里的问题是只会显示适合背景图像的组件(在我的示例中只有前 10 个 JLabel)

我尝试使用 JScrollPane

    JScrollPane scroll=new JScrollPane(l);
    for(int i=0;i<20;i++)
         label.add(new JLabel(i.toString()));
    frame.add(scroll);

但变化不大,所以我尝试使用 JPanel

    JPanel panel=new JPanel();
    panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
    JScrollPane scroll=new JScrollPane(panel);
    for(int i=0;i<20;i++)
         panel.add(new JLabel(i.toString()));
    label.add(scroll);
    frame.add(label);

所以我让 JScrollPane 正常工作,但 JPanel 已经覆盖了背景图像

我该怎么办?

以下是将 JLabels 添加到标签的结果:

将它们添加到滚动后的结果:

在将setOpaque(false) 添加到JPanel 之后:

【问题讨论】:

  • JPanel 的不透明设置为false。但是,为了获得更好的帮助,请尽快发布minimal reproducible example 和 ASCII 艺术/图像,说明您拥有的和想要实现的目标,这将大大改善您的帖子。由于您还没有足够的声誉,您可以为您的图片添加链接,我们可以编辑帖子并使其显示在此处
  • 另外,作为一个建议,让你的变量更具描述性,ll 是什么?我必须在代码中知道它是什么,而是将它们称为labelpane / panel 用于面板,s 将其更改为scroll / scrollPane / 等;它将使您和我们的代码更易于阅读和理解
  • 不,它没有用
  • 好吧,然后发布一个可运行的示例,图像,并在这样做时遵循我的第二条评论建议,以便我们提供更多帮助
  • 这是将 JLabels 添加到标签 imgur.com/W0xMDdl 的结果,这是将它们添加到滚动的结果 imgur.com/FOEf9M4,这是我将面板不透明设置为 false imgur.com/TIlhgPS

标签: java swing jpanel jlabel jscrollpane


【解决方案1】:

您可以将图像添加为JPanelpaintComponent() 方法的一部分,然后在其上方添加标签,然后将该窗格放在JScrollPane 中,最后将其添加到JFrame,例如:

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class PanelWithBackgroundImage {
    
    private JFrame frame;
    private JPanel pane;
    private Image img;
    private JScrollPane scroll;
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            
            @Override
            public void run() {
                new PanelWithBackgroundImage().createAndShowGui();
            }
        });
    }
    
    public void createAndShowGui() {
        frame = new JFrame("JFrame with bg example");
        try {
            img = ImageIO.read(new FileInputStream("/home/jesus/Pictures/tokyo.jpg"));
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        pane = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
            }
        };
        
        pane.setLayout(new BoxLayout(pane, BoxLayout.PAGE_AXIS));
        
        for (int i = 0; i < 20; i++) {
            pane.add(new JLabel("label " + i));
        }
        
        scroll = new JScrollPane(pane);
        
        frame.add(scroll);
        frame.setSize(frame.getPreferredSize());
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

它给出以下输出:

如果您希望JLabels 居中,您可以更改for 循环:

for (int i = 0; i < 20; i++) {
    JLabel label = new JLabel("label " + i);
    label.setAlignmentX(Component.CENTER_ALIGNMENT);
    pane.add(label);
}

应该看起来像这样:


注意:

您可以复制粘贴上面的代码,它应该可以工作,只需更改图像路径,该代码称为Minimal, Complete and Verifiable Example (MCVE),下一次,请发布一个演示您尝试过的内容,而不仅仅是部分它,这样你会得到更多,更好,更快的答案。帮助我们来帮助你! :)

【讨论】:

    猜你喜欢
    • 2018-10-25
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    相关资源
    最近更新 更多