如何将容器内的内部框架图标化到特定位置
How to iconify a internal frame inside a container to a specific position
我想将我的内部框架图标化到主框架的相邻面板而不是主框架的默认左下角。
我正在使用 jdesktopframe 及其内部框架。
我想图标化连接细节,它是一个内部框架,图标化的图标应该出现在最小化按钮所在的位置,而不应该出现在主框架的左下角。
这是示例代码:
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);
}
}
我也想在内部框架最小化和最大化时调整主框架的大小
诀窍是您不对 JInternalFrame
对象执行 setLocation()
或 setBounds()
操作。这将移动窗格,当您 "iconified" 内部框架时,窗格不再可见。但是,当您 "iconified" 内部框架时,您改为更改 现在 可见的 Icon
。要获取图标,您可以在 JInternalFrame
class 上使用 getDesktopIcon()
方法。之后,它是对接收到的 JInternalFrame.JDesktopIcon
对象的 setLocation()
调用的简单调用。你可以这样使用它:
frame.addInternalFrameListener(new InternalFrameAdapter() {
@Override
public void internalFrameIconified(InternalFrameEvent e) {
frame.getDesktopIcon().setLocation(frame.getLocation().x, frame.getLocation().y);
}
});
显然,您必须自己计算出您希望放置图标的正确位置。此示例仅显示如何 将图标移动到正确的位置,因此它不会在左下角打开。
您可能想为相反的 internalFrameDeiconified
事件添加类似的事件处理程序,以打开图标所在的原始 JInternalFrame
面板,而不是 [=32= 之前面板所在的位置].
我想将我的内部框架图标化到主框架的相邻面板而不是主框架的默认左下角。
我正在使用 jdesktopframe 及其内部框架。
我想图标化连接细节,它是一个内部框架,图标化的图标应该出现在最小化按钮所在的位置,而不应该出现在主框架的左下角。
这是示例代码:
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);
}
}
我也想在内部框架最小化和最大化时调整主框架的大小
诀窍是您不对 JInternalFrame
对象执行 setLocation()
或 setBounds()
操作。这将移动窗格,当您 "iconified" 内部框架时,窗格不再可见。但是,当您 "iconified" 内部框架时,您改为更改 现在 可见的 Icon
。要获取图标,您可以在 JInternalFrame
class 上使用 getDesktopIcon()
方法。之后,它是对接收到的 JInternalFrame.JDesktopIcon
对象的 setLocation()
调用的简单调用。你可以这样使用它:
frame.addInternalFrameListener(new InternalFrameAdapter() {
@Override
public void internalFrameIconified(InternalFrameEvent e) {
frame.getDesktopIcon().setLocation(frame.getLocation().x, frame.getLocation().y);
}
});
显然,您必须自己计算出您希望放置图标的正确位置。此示例仅显示如何 将图标移动到正确的位置,因此它不会在左下角打开。
您可能想为相反的 internalFrameDeiconified
事件添加类似的事件处理程序,以打开图标所在的原始 JInternalFrame
面板,而不是 [=32= 之前面板所在的位置].