2016-09-13 7 views
0

Чтобы добавить фоновое изображение, я работаю над JLabels вместо JPanel.Фиксация JScrollPane с помощью JLabel

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 первых JLabels)

Я попытался с помощью 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

Вы можете добавить изображение в качестве части paintComponent() метода JPanel «s, затем добавить метки над ним, а затем положить эту панель внутри 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), отправьте сообщение, в котором показано, что вы пробовали, а не только его части, это вы получите больше, лучше и быстрее. Помогите нам помочь вам! :)

Смежные вопросы