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

Я работаю над приложением для создания и редактирования кроссвордов, код которого я выложил в конце, если это поможет. В настоящее время я пытаюсь решить проблему, которая возникла в этой части кода.

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 до размеров JButton после их изменения, чтобы компенсировать изменение их размера из-за используемого 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 Ответ

1 голос
/ 25 октября 2011

повторяет то, что сказал Бдарес в своем комментарии выше.Я бы использовал ограниченный набор (2?) Иконок, которые можно разместить в нужных местах при изменении размера сетки.Нет причин, по которым вам нужно изменять размер похожих изображений для каждого квадрата (при условии, что они похожи!).

...