Почему мой графический макет меняется при загрузке фотографии? - PullRequest
0 голосов
/ 23 января 2019

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

Ниже приведен код для моего менеджера макета

public SearchService() throws Exception {

        setSize(600, 600);
        setResizable(false);

        JPanel mainPanel = new JPanel();
        JPanel templatePanel = new JPanel();
        JPanel toolPanel = new JPanel();

        JLabel picLabel = new JLabel();
        JLabel tools = new JLabel("Tools");
        JLabel templates = new JLabel("Templates");

        JButton upload = new JButton("Upload");
        JButton search = new JButton("Search");
        JButton save = new JButton("Save");

        //Main panel
        GridBagLayout GBPanel = new GridBagLayout();
        GridBagConstraints GBC = new GridBagConstraints();
        mainPanel.setLayout( GBPanel );

        //Template panel
        GBC.gridx = 0;
        GBC.gridy = 0;
        GBC.gridwidth = 1; 
        GBC.gridheight = 3; 
        GBC.fill = GridBagConstraints.BOTH; 
        GBC.weightx = 1; 
        GBC.weighty = 0;
        GBC.anchor = GridBagConstraints.WEST;
        GBPanel.setConstraints( leftPanel, GBC );
        leftPanel.add(templates); 
        mainPanel.add( leftPanel ); 

        //Picture label
        GBC.gridx = 1;
        GBC.gridy = 0;
        GBC.gridwidth = 2;
        GBC.gridheight = 1;
        GBC.fill = GridBagConstraints.BOTH;
        GBC.weightx = 0;
        GBC.weighty = 1;
        GBC.anchor = GridBagConstraints.CENTER;
        GBPanel.setConstraints( picLabel, GBC );
        mainPanel.add( picLabel );

        //Tool panel
        GBC.gridx = 4;
        GBC.gridy = 0;
        GBC.gridwidth = 1;
        GBC.gridheight = 3;
        GBC.fill = GridBagConstraints.BOTH;
        GBC.weightx = 1;
        GBC.weighty = 0;
        GBC.anchor = GridBagConstraints.EAST;
        GBPanel.setConstraints( rightPanel, GBC );
        rightPanel.add(tools);
        mainPanel.add( rightPanel );

        //Upload button
        GBC.gridx = 1;
        GBC.gridy = 1;
        GBC.gridwidth = 1;
        GBC.gridheight = 1;
        GBC.fill = GridBagConstraints.BOTH;
        GBC.weightx = 1;
        GBC.weighty = 0;
        GBC.anchor = GridBagConstraints.PAGE_START;
        GBPanel.setConstraints( upload, GBC );
        mainPanel.add( upload );

        //Save button
        GBC.gridx = 2;
        GBC.gridy = 1;
        GBC.gridwidth = 1;
        GBC.gridheight = 1;
        GBC.fill = GridBagConstraints.BOTH;
        GBC.weightx = 1;
        GBC.weighty = 0;
        GBC.anchor = GridBagConstraints.PAGE_START;
        GBPanel.setConstraints( save, GBC );
        mainPanel.add( save );

        //Search button
        GBC.gridx = 1;
        GBC.gridy = 2;
        GBC.gridwidth = 2;
        GBC.gridheight = 1;
        GBC.fill = GridBagConstraints.BOTH;
        GBC.weightx = 1;
        GBC.weighty = 0;
        GBC.anchor = GridBagConstraints.PAGE_START;
        GBPanel.setConstraints( search, GBC );
        mainPanel.add( search );

        add(mainPanel);

и ниже код, который добавляет картинку

upload.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JFileChooser chooser = new JFileChooser("C:\\Users); 
                FileNameExtensionFilter filter = new FileNameExtensionFilter("Image", "jpg", "png", "bmp");
                chooser.setFileFilter(filter);
                int result = chooser.showOpenDialog(null);

                if (result == JFileChooser.APPROVE_OPTION) {
                    File selectedFile = chooser.getSelectedFile();
                    BufferedImage bi;
                    userPhoto = chooser.getSelectedFile().getPath();

                    try {
                        bi = ImageIO.read(selectedFile);
                        Image dimg = bi.getScaledInstance(picLabel.getWidth(), picLabel.getHeight(), Image.SCALE_SMOOTH);
                        picLabel.setIcon(new ImageIcon(dimg));
                    }
                    catch(IOException IOe) {
                        IOe.printStackTrace();
                    }
                    System.out.println(userPhoto);
                }
            }
        });

Я добавил две фотографии, чтобы показать результаты с моей программой. Вот так это выглядит при первом запуске и как я хочу чтобы макет остался Before

и вот так выглядит макет после загрузки изображения

After

Как вы можете видеть, левая и правая панели сжимаются, и изображение даже не занимает всю метку изображения.

Я также добавил эту строку System.out.println (picLabel.getWidth ()); в слушателе действия и увидел, что при первом нажатии кнопки размер устанавливается на 299, но если я нажимаю кнопку снова, он меняется и делает это каждый раз. Я хочу знать, возможно ли, чтобы изображение оставалось на ширине 299.

1 Ответ

0 голосов
/ 23 января 2019
    GBC.gridwidth = 5; 
    GBC.gridheight = 20

Вы не можете просто произвольно назначить gridwith / height для компонента. На самом деле вам нужно 20 других компонентов, если вы хотите, чтобы компонент занимал ту же высоту, что и другие компоненты.

Как вы можете видеть, левая и правая панели сжимаются, и изображение даже не занимает всю метку изображения.

Если вы не хотите, чтобы макет менялся, используйте другой менеджер макетов или вложенные панели с другими менеджерами макетов.

Например, вы начинаете с BorderLayout.

Затем вы можете добавить панели к LINE_START и LINE_END.

Тогда вам нужна еще одна панель в CENTER. Снова вы можете использовать BorderLayout. Вы добавляете свою картинку в CENTER, а затем в другую панель с кнопками в PAGE_END.

Теперь все компоненты, кроме изображения, имеют фиксированный размер. Пространство, доступное для изображения, будет варьироваться в зависимости от размера рамки.

Итак, основной код:

JPanel buttonPanel = new JPanel(...);
JLabel image = new JLabel(...);

JPanel center = new JPanel( new BorderLayout() );
center.add(image, BorderrLayout.CENTER);
center.add(buttonPanel, BorderLayout.PAGE_END);

JPanel leftPanel = new JPanel(...);
JPanel rightPanel = new JPanel(...);

frame.add(leftPanel, BorderLayout.LINE_START);
frame.add(center, BorderLayout.CENTER);
frame.add(rightPanel, BorderLayout.LINE_END);

Гораздо менее запутанно, чем пытаться играть со всеми ограничениями GridBagLayout.

Теперь дочерние панели (слева, справа, кнопки) могут использовать соответствующие менеджеры раскладки.

...