Более эффективный / быстрый способ масштабирования ImageIcon?

#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. Однако результат этого кода не совсем соответствует моим ожиданиям по двум причинам.

  1. Для изменения размера всех 225 квадратов требуется много времени, что, как я предполагаю, не является типичным размером кроссворда. Я хочу позже создать функцию редактирования размера, поэтому, вероятно, я хочу иметь возможность обрабатывать больше квадратов.
  2. Иногда это работает, но в других случаях квадраты становятся очень узкими при увеличении, и я не уверен, почему это происходит.

По сути, мне нужно найти более быстрый подход. Есть идеи о том, как его изменить / улучшить? Имеет ли какое-либо значение выполнение обновлений с помощью метода рисования?

     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?) значков, которые можно разместить в нужных местах при изменении размера сетки. Нет причин, по которым вам нужно изменять размеры похожих изображений для каждого квадрата (при условии, что они похожи!).