【发布时间】:2015-12-04 15:17:56
【问题描述】:
这是我的程序代码,该程序具有背景图像并在其上使用组件:
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;
}
}
-
TeamsDrawSim 类:
public class TeamsDrawSim { public static void main(String[] args) { // TODO Auto-generated method stub FirstWindow firstWindow = new FirstWindow(); } }
在此代码中,在完成与名称数量有关的所有过程之后,我创建了一个窗口,其中包含从我的文件上传的背景图像,在需要时包含一个垂直滚动条和一个带有假不透明的面板,我将所有我的组件(在第一阶段我创建 jlabels)。问题是当我创建太多标签时,需要出现垂直滚动条,背景图像会沿着滚动条的边缘延伸。我想要做的是在滚动条的任何点显示整个图像。知道为什么会这样吗?下面我给你两张问题的截图,一张用于少量标签,一张用于大量标签。窗口可以调整大小,在全屏模式下也会发生同样的事情。
标签数量少:
大量标签
【问题讨论】:
-
请添加一个最小但完整的代码示例,我不想在那个代码转储中寻找你的问题
标签: java image image-processing image-scaling