Как обозначить внутреннюю рамку внутри контейнера в определенной позиции - PullRequest
0 голосов
/ 25 мая 2019

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

Я использую jdesktopframe и внутренние рамки.

https://i.stack.imgur.com/S5xi5.jpg

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

это пример кода:

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyVetoException;
import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.plaf.basic.BasicInternalFrameTitlePane;
import javax.swing.plaf.basic.BasicInternalFrameUI;


public class MinPanel {

    public MinPanel() throws HeadlessException, PropertyVetoException {
        createAndShowGUI();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    new MinPanel();
                } catch (HeadlessException ex) {
                } catch (PropertyVetoException ex) {
                }

            }
        });
    }

    private void createAndShowGUI() throws HeadlessException, PropertyVetoException {
        JFrame frame = new JFrame();
        frame.setResizable(true);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        final JDesktopPane jdp = new JDesktopPane() {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(400, 200);
            }
        };

        frame.setContentPane(jdp);
        frame.pack();

        createAndAddInternalFrame(jdp, 0, 0);
        createAndAddfixedpanel(jdp,200,0);

        frame.setVisible(true);
    }

    private void createAndAddInternalFrame(final JDesktopPane jdp, int x, int y) throws PropertyVetoException {
        final JInternalFrame jInternalFrame = new JInternalFrame("Test1", false, false, false, false);
        jInternalFrame.setLocation(x, y);

        jInternalFrame.setLayout(new GridLayout(2, 2));
        jInternalFrame.setSize(200, 200);//testing
        JButton jb = new JButton("min");
        jInternalFrame.add(jb);
        jb.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                try {
                    jInternalFrame.setIcon(true);
                } catch (PropertyVetoException ex) {
                }

            }
        });
       BasicInternalFrameTitlePane titlePane = (BasicInternalFrameTitlePane) ((BasicInternalFrameUI) jInternalFrame.getUI()).getNorthPane();
      jInternalFrame.remove(titlePane);


        jInternalFrame.setVisible(true);
        jdp.add(jInternalFrame);
    }
     private void createAndAddfixedpanel(final JDesktopPane jdp, int x, int y)
     { JPanel panel = new JPanel();
      panel.setLocation(x, y);
        panel.setLayout(new FlowLayout());  
         panel.setSize(200, 200);
        JLabel label = new JLabel("JFrame By Example");  
        JButton button = new JButton();  
        button.setText("Button");  
        panel.add(label);  
        panel.add(button);  

         panel.setVisible(true);
     jdp.add(panel);  

     }
}

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

1 Ответ

1 голос
/ 25 мая 2019

Хитрость в том, что вы не делаете вещи setLocation() или setBounds() для объекта JInternalFrame. Это переместит панель, которая больше не будет видна, когда вы «обозначите» внутреннюю рамку. Но вместо этого вы изменяете Icon, который теперь виден, когда вы "обозначали" внутренний фрейм. Чтобы получить значок, вы используете метод getDesktopIcon() в классе JInternalFrame. После этого это простой вызов setLocation() для полученного JInternalFrame.JDesktopIcon объекта. Вы можете использовать это так:

frame.addInternalFrameListener(new InternalFrameAdapter() {
    @Override
    public void internalFrameIconified(InternalFrameEvent e) {
        frame.getDesktopIcon().setLocation(frame.getLocation().x, frame.getLocation().y);
    }
});

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

Возможно, вы захотите добавить аналогичный обработчик события для противоположного события internalFrameDeiconified, чтобы открыть исходную панель JInternalFrame там, где находится значок, а не там, где была панель до того, как она была «иконизирована».

...