2015-12-04 5 views
-1

Это мой код для программы, которая имеет фоновое изображение и принимает компоненты на ней:BackgroundImage масштабирование

1.FirstWindow класс:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.GridLayout; 
import java.awt.Image; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import javax.imageio.ImageIO; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextField; 


public class FirstWindow { 
    private int option; 
    private int numberOfNames; 
    private String options[] = {"OK","Cancel"}; 
    private JPanel aPanel; 

    public FirstWindow(){ 
     JPanel panel = new JPanel(); 
     JLabel lbl = new JLabel("Give the number of names:"); 
     JTextField text = new JTextField(10); 
     panel.add(lbl); 
     panel.add(text); 
     option = JOptionPane.showOptionDialog(null,panel,"Number of Names",JOptionPane.NO_OPTION,JOptionPane.QUESTION_MESSAGE,null, options,options[0]); 
     if (option == 0){ 
      String number = text.getText(); 
      if (number == null || number.equals("")){ 
       JOptionPane.showMessageDialog(null, "No input given.\nProgram will terminate.","No Input Error",JOptionPane.ERROR_MESSAGE); 
       System.exit(0); 
      } 
      try{ 
       numberOfNames = Integer.parseInt(number); 
       if (numberOfNames>=0 && numberOfNames<4){ 
        JOptionPane.showMessageDialog(null, "No reason for holding a draw.\nProgram will terminate.",JOptionPane.PLAIN_MESSAGE); 
        System.exit(0); 
       } 
       else if (numberOfNames>=4){ 
        //frame 
        JFrame firstWindowFrame = new JFrame(); 
        firstWindowFrame.setPreferredSize(new Dimension(600,600)); 
        firstWindowFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        firstWindowFrame.setResizable(true); 
        firstWindowFrame.setLayout(new BorderLayout()); 
        firstWindowFrame.setVisible(true); 
        Image image = ImageIO.read(new File("/home/george/Desktop/chl.jpg")); 
        BackGroundPanel bp = new BackGroundPanel(image); 
        firstWindowFrame.add(bp,BorderLayout.CENTER); 
        bp.setLayout(new BorderLayout()); 
        firstWindowFrame.add(new JScrollPane(bp),BorderLayout.CENTER); 
        JPanel aPanel = new JPanel(); 
        aPanel.setOpaque(false); 
        bp.add(aPanel,BorderLayout.CENTER); 
        aPanel.setLayout(new GridLayout(0,2)); 
        for (int i=0;i<150;i++){ 
         aPanel.add(new JLabel("NAME")); 
        } 

        Component array[][] = new Component[numberOfNames][2]; 
        for (int i=0;i<array.length;i++){ 
         array[i][0] = new JLabel("Name"+(i+1)+":"); 
         array[i][1] = new JTextField(10); 
        } 
        for (int i=0;i<array.length;i++){ 
         array[i][0].setFont(new Font(array[i][0].getFont().getFontName(),Font.BOLD,array[i][0].getFont().getSize()+5)); 
         array[i][0].setForeground(Color.WHITE); 
        } 
        firstWindowFrame.pack(); 
       } 
       else if (numberOfNames<0){ 
        JOptionPane.showMessageDialog(null, "Invalid Number Given.\nProgram will terminate","Negative Number Error",JOptionPane.ERROR_MESSAGE); 
        System.exit(0); 
       } 


      } 
      catch(Exception invalidInput){ 
       JOptionPane.showMessageDialog(null, "Invalid Input.\nTry again","Input Error",JOptionPane.ERROR_MESSAGE); 
       option = JOptionPane.showOptionDialog(null,panel,"Number of Names",JOptionPane.NO_OPTION,JOptionPane.QUESTION_MESSAGE,null,options,options[0]); 
      } 
     } 
     else if (option==1){ 
      System.exit(0); 
     } 
    } 
} 

2.BackGroundPanel Класс:

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.image.BufferedImage; 
import javax.swing.JPanel; 


public class BackGroundPanel extends JPanel{ 
    Image image; 
    public BackGroundPanel(Image image){ 
     this.image = image; 
    } 
    protected void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     Image scaled = image.getScaledInstance(getWidth(), getHeight(), Image.SCALE_FAST); 
     g.drawImage(scaled, 0, 0, null); 
    } 

    public Dimension getPreferredSize(){ 
     Dimension d = super.getPreferredSize(); 
     int w = d.width > image.getWidth(null)? d.width:image.getWidth(null); 
     int h = d.height > image.getHeight(null)?d.height:image.getHeight(null); 
     return new Dimension(w,h); 
    } 

    public Image getImage(){ 
     return image; 
    } 

    public void setImage(BufferedImage image){ 
     this.image = image; 
    } 
} 
  1. TeamsDrawSim класс:

    public class TeamsDrawSim { 
        public static void main(String[] args) { 
         // TODO Auto-generated method stub 
         FirstWindow firstWindow = new FirstWindow(); 
        } 
    } 
    

В этом коде после всего процедуры, которая имеет отношение к числу имен, я создать окно с фоновым изображением загруженного из моих файлов, который содержит вертикальную полосу прокрутку при необходимости и панелью с ложными непрозрачным на который я размещаю во всех моих компонентах (на первом этапе я создаю jlabels). Проблема заключается в том, что, когда я создаю слишком много меток, чтобы вертикальная полоса прокрутки появлялась, фоновое изображение растягивается по краям полосы прокрутки. Я хочу показать все изображение в любой точке полосы прокрутки. Любая идея, почему это происходит? Ниже я даю вам два скриншота проблемы: один для небольшого количества ярлыков и один для большого количества ярлыков. Окно изменчимо, и то же самое происходит в полноэкранном режиме.

Малое количество этикеток:

http://i.stack.imgur.com/inNsK.jpg

большое количество этикеток

http://i.stack.imgur.com/KONxu.jpg

+0

Пожалуйста, добавьте ** минимальный **, но полный пример кода, я не хочу, чтобы вы искали свою проблему в этой дампе кода – TheLethalCoder

ответ

0

Что я хочу сделать это, чтобы показать все изображение в любой точке скроллинга ,

Вам необходимо нарисовать фоновое изображение на видовом экране прокрутки вместо панели. Тогда изображение всегда будет масштабироваться до размера окна просмотра. Вам также необходимо сделать панель непрозрачной, чтобы изображение было видно. Что-то вроде:

JPanel panel = new JPanel(...); 
panel.setOpaque(false); 
panel.add(...); 

JViewport viewport = new JViewport() 
{ 
    @Override 
    protected void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 

     g.drawImage(image, 0, 0, getWidth(), getHeight(), this); 
    } 
}; 

JScrollPane scrollPane = new JScrollPane(); 
scrollPane.setViewport(viewport); 
scrollPane.setViewportView(panel);