2016-09-13 124 views
0

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

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); 

所以我得到了JScrollPa ne正常工作,但JPanel已经覆盖了背景图片

我该怎么办?

这里的结果添加的JLabel标注:将其添加到滚动后

enter image description here

结果:

enter image description here

并添加setOpaque(false)JPanel后:

enter image description here

+1

设置'JPanel'不透明为false。但是,为了更快地获得更好的帮助,请发布[mcve]和ASCII艺术/图片,了解您拥有的内容以及想要实现的目标,这将大大改善您的文章。由于您还没有足够的声望,您可以添加一个链接到您的图片,我们可以编辑帖子,并在这里显示 – Frakcool

+1

此外,作为旁边的建议,让你的变量更具描述性,'l'什么是'l '?我不得不在代码中知道它是什么,而是将它们称为面板的'label'或'pane' /'panel','s'将它改为'scroll' /'scrollPane'/etc;它会使代码更容易阅读和理解你和我们 – Frakcool

+0

没有它没有工作 –

回答

3

您可以添加图像作为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); 
    } 
} 

这给下面的输出:

enter image description hereenter image description here

如果你想JLabels中心,你可以改变for循环使用:

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

看起来应该与此类似:

enter image description here


注:

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