#java #performance #imageicon #image-scaling #crossword
#java #Производительность #imageicon #масштабирование изображения #кроссворд
Вопрос:
Я работаю над приложением для создания и редактирования кроссвордов, код для которого я опубликовал в конце, если это поможет. В настоящее время я пытаюсь решить проблему, которая возникла в этой части кода.
public void componentResized(ComponentEvent e) {
// TODO Auto-generated method stub
for(int i=0; i<width; i ) {
for(int j=0; j<height; j ) {
if(e.getSource()==crosswordSquare[i][j]){
blackSquare = new ImageIcon(blackSquare.getImage().getScaledInstance(
crosswordSquare[i][j].getWidth(), crosswordSquare[i][j].getHeight(), 1));
crosswordSquare[i][j].setIcon(blackSquare);
}
}
}
}
По сути, я пытаюсь изменить размеры ImageIcons для JButtons в соответствии с размерами JButtons после их изменения, чтобы компенсировать их изменение размера из-за используемого мной GridLayout. Однако результат этого кода не совсем соответствует моим ожиданиям по двум причинам.
- Для изменения размера всех 225 квадратов требуется много времени, что, как я предполагаю, не является типичным размером кроссворда. Я хочу позже создать функцию редактирования размера, поэтому, вероятно, я хочу иметь возможность обрабатывать больше квадратов.
- Иногда это работает, но в других случаях квадраты становятся очень узкими при увеличении, и я не уверен, почему это происходит.
По сути, мне нужно найти более быстрый подход. Есть идеи о том, как его изменить / улучшить? Имеет ли какое-либо значение выполнение обновлений с помощью метода рисования?
public class CrosswordInterface extends JFrame
implements ComponentListener, ActionListener{
//private ArrayList<ArrayList<JButton>> squares= new ArrayList<ArrayList<JButton>>();
private JButton[][] crosswordSquare = new JButton[15][15];
private ImageIcon blackSquare = new ImageIcon(
CrosswordInterface.class.getResource("BlackSquare.png"));
private JPanel panel = new JPanel();
//stores default width and height of square array
//initial value of 15 (225 squares)
private int width = 15;
private int height = 15;
public CrosswordInterface() {
CreateCrosswordGrid();
setSize(width *blackSquare.getIconWidth(), height*blackSquare.getIconHeight());
setVisible(true);
setResizable(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public int getWidth() {
return width;
}
public int getHeight() {
return height;
}
private void CreateCrosswordGrid() {
panel.setLayout(new GridLayout(width, height));
for(int i=0; i<width; i ) {
for(int j=0; j<height; j ) {
JButton b = new JButton();
b.setIcon(blackSquare);
//b.setText(text);
//b.setIconTextGap()
//b.setIco;
b.setSize(blackSquare.getIconWidth(), blackSquare.getIconHeight());
crosswordSquare[i][j]=b;
crosswordSquare[i][j].addComponentListener(this);
panel.add(crosswordSquare[i][j]);
}
}
panel.setSize(width * blackSquare.getIconWidth(), height * blackSquare.getIconHeight());
setSize(height * blackSquare.getIconWidth(), width * blackSquare.getIconHeight());
//panel.set
add(panel);
}
public void actionPerformed(ActionEvent e) {
for(int i=0; i<width; i ) {
for(int j=0; j<height; j ) {
if(e.getSource()==crosswordSquare[i][j]){
}
}
}
}
public void componentHidden(ComponentEvent e) {
// TODO Auto-generated method stub
}
public void componentMoved(ComponentEvent e) {
// TODO Auto-generated method stub
}
public void componentResized(ComponentEvent e) {
// TODO Auto-generated method stub
for(int i=0; i<width; i ) {
for(int j=0; j<height; j ) {
if(e.getSource()==crosswordSquare[i][j]){
blackSquare = new ImageIcon(blackSquare.getImage().getScaledInstance(
crosswordSquare[i][j].getWidth(), crosswordSquare[i][j].getHeight(), 1));
crosswordSquare[i][j].setIcon(blackSquare);
}
}
}
}
public void componentShown(ComponentEvent e) {
// TODO Auto-generated method stub
}
}
Комментарии:
1. Похоже, у вас есть сотни маленьких изображений, которые вы храните и обрабатываете. Возможно ли создать экземпляр, скажем, 27 изображений и загрузить их в правильные места? (а именно объекты
ImageIcon
класса …)
Ответ №1:
повторяя то, что сказал bdares в своем комментарии выше. Я бы использовал ограниченный набор (2?) значков, которые можно разместить в нужных местах при изменении размера сетки. Нет причин, по которым вам нужно изменять размеры похожих изображений для каждого квадрата (при условии, что они похожи!).