BackGroundImage缩放

时间:2015-12-04 15:17:57

标签: java image image-processing image-scaling

这是我的程序代码,该程序具有背景图像并在其上包含组件:

1.FirstWindow class:

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();
        }
    }
    
  2. 在这个代码完成所有与名称数量有关的程序之后,我创建了一个窗口,其中包含从我的文件上传的背景图像,其中包含需要时的垂直滚动条和带有假不透明的面板,我放置所有我的组件(在第一阶段,我创建jlabels)。问题是,当我创建太多标签,以便需要显示垂直滚动条时,背景图像会延伸到滚动条的边缘。我想要做的是在滚动条的任何一点显示整个图像。知道为什么会这样吗?下面我给你两个问题的截图,一个用于少量标签,一个用于大量标签。窗口可调整大小,在全屏模式下也会发生同样的事情。

    少量标签:

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

    大量标签

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

1 个答案:

答案 0 :(得分: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 );
相关问题