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