Это мой код для программы, которая имеет фоновое изображение и принимает компоненты на ней: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;
}
}
TeamsDrawSim класс:
public class TeamsDrawSim { public static void main(String[] args) { // TODO Auto-generated method stub FirstWindow firstWindow = new FirstWindow(); } }
В этом коде после всего процедуры, которая имеет отношение к числу имен, я создать окно с фоновым изображением загруженного из моих файлов, который содержит вертикальную полосу прокрутку при необходимости и панелью с ложными непрозрачным на который я размещаю во всех моих компонентах (на первом этапе я создаю jlabels). Проблема заключается в том, что, когда я создаю слишком много меток, чтобы вертикальная полоса прокрутки появлялась, фоновое изображение растягивается по краям полосы прокрутки. Я хочу показать все изображение в любой точке полосы прокрутки. Любая идея, почему это происходит? Ниже я даю вам два скриншота проблемы: один для небольшого количества ярлыков и один для большого количества ярлыков. Окно изменчимо, и то же самое происходит в полноэкранном режиме.
Малое количество этикеток:
большое количество этикеток
Пожалуйста, добавьте ** минимальный **, но полный пример кода, я не хочу, чтобы вы искали свою проблему в этой дампе кода – TheLethalCoder