Java 如何最小化容器内的面板
我有三个按钮关闭,最小和最大。Java 如何最小化容器内的面板,java,swing,jpanel,layout-manager,flowlayout,Java,Swing,Jpanel,Layout Manager,Flowlayout,我有三个按钮关闭,最小和最大。 当我想最大化它时,它将采用主容器的形状,并与所有面板重叠,当我关闭它时,只有该面板受到影响。但是当我点击min按钮时,它会最小化到我不想要的任务栏 我希望它像internalFrame一样位于conatiner内部,当您单击最小化按钮时,它会在主框架内最小化 这是密码 package Project; import java.awt.Color; import java.awt.Frame; import java.awt.GridLayout; import
当我想最大化它时,它将采用主容器的形状,并与所有面板重叠,当我关闭它时,只有该面板受到影响。但是当我点击min按钮时,它会最小化到我不想要的任务栏
我希望它像internalFrame一样位于conatiner内部,当您单击最小化按钮时,它会在主框架内最小化 这是密码
package Project;
import java.awt.Color;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.border.LineBorder;
public class MinPanel {
public MinPanel() {
createAndShowGui();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new MinPanel();
}
});
}
private void createAndShowGui() {
JFrame frame = new JFrame();
frame.setSize(300, 500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JPanel mainPanel = new JPanel(new GridLayout(2, 2));
for (int i = 0; i < 4; i++) {
final int num = i;
OmniPanel op = new OmniPanel(mainPanel, frame) {
@Override
public JPanel createPanel() {
JPanel p = createSimplePanelInterface();
p.add(new JLabel("Panel " + (num + 1)));
return p;
}
@Override
void toPanel() {
super.toPanel();
System.out.println("Frame requested to be brought to panel");
}
};
mainPanel.add(op.getPanel());
}
frame.add(mainPanel);
//frame.pack();
frame.setVisible(true);
}
}
abstract class OmniPanel {
protected JFrame frame;
protected JPanel panel;
boolean maximized = false;
private final JComponent owner;
private final JFrame ownerFrame;
public OmniPanel(JComponent owner, JFrame con) {
this.owner = owner;
initOmniPanel();
this.ownerFrame = con;
}
private void initOmniPanel() {
panel = createPanel();
createFrame();
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowDeiconified(WindowEvent we) {
super.windowDeiconified(we);
toPanel();
}
});
}
public JPanel getPanel() {
return panel;
}
public JFrame getFrame() {
return frame;
}
public boolean goFrame() {
frame.add(panel);
frame.pack();
frame.setState(JFrame.ICONIFIED);
frame.setVisible(true);
return true;
}
protected void createFrame() {
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
void toPanel() {
frame.remove(panel);
frame.dispose();
owner.add(panel);
owner.revalidate();
owner.repaint();
}
public JPanel createSimplePanelInterface() {
JPanel p = new JPanel();
JButton close = new JButton("X");
JButton minimize = new JButton("_");
JButton maximize = new JButton("[]");
p.add(close);
p.add(minimize);
p.add(maximize);
close.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
if (maximized) {
maximized = false;
ownerFrame.setGlassPane(new JComponent() {
});
ownerFrame.revalidate();
ownerFrame.repaint();
} else {
removePanelFromOwner();
getFrame().dispose();
}
}
});
minimize.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
if (maximized) {
maximized = false;
ownerFrame.setGlassPane(new JComponent() {
});
owner.add(panel);
owner.revalidate();
owner.repaint();
ownerFrame.revalidate();
ownerFrame.repaint();
} else {
removePanelFromOwner();
goFrame();
frame.setState(Frame.ICONIFIED);
}
}
});
maximize.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
if (maximized) {
return;
}
maximized = true;
removePanelFromOwner();
ownerFrame.setGlassPane(panel);
ownerFrame.revalidate();
ownerFrame.repaint();
panel.setVisible(true);//
}
});
p.setBorder(new LineBorder(Color.black));
return p;
}
private void removePanelFromOwner() {
owner.remove(getPanel());
owner.revalidate();
owner.repaint();
}
abstract JPanel createPanel();
}
成套工程;
导入java.awt.Color;
导入java.awt.Frame;
导入java.awt.GridLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.WindowAdapter;
导入java.awt.event.WindowEvent;
导入javax.swing.JButton;
导入javax.swing.JComponent;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.SwingUtilities;
导入javax.swing.border.LineBorder;
公共类专家组{
公共事务委员会(){
createAndShowGui();
}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
新面板();
}
});
}
私有void createAndShowGui(){
JFrame=新JFrame();
框架。设置尺寸(300500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
最终JPanel主面板=新JPanel(新网格布局(2,2));
对于(int i=0;i<4;i++){
最终整数=i;
OmniPanel op=新的OmniPanel(主面板,框架){
@凌驾
公共JPanel createPanel(){
JPanel p=createSimplePanelInterface();
p、 添加(新JLabel(“面板”+(num+1));
返回p;
}
@凌驾
void toPanel(){
super.toPanel();
System.out.println(“要求带到面板的框架”);
}
};
添加(op.getPanel());
}
添加框架(主面板);
//frame.pack();
frame.setVisible(true);
}
}
抽象类泛面板{
保护JFrame;
受保护的JPanel面板;
布尔最大化=假;
私人最终组件所有者;
私有最终JFrame ownerFrame;
公共综合面板(JC组件所有者,JFrame con){
this.owner=所有者;
initOmniPanel();
this.ownerFrame=con;
}
私有void initOmniPanel(){
panel=createPanel();
createFrame();
frame.addWindowListener(新的WindowAdapter(){
@凌驾
公共无效窗口取消确认(WindowEvent we){
超级窗口去证实(we);
托帕内尔();
}
});
}
公共JPanel getPanel(){
返回面板;
}
公共JFrame getFrame(){
返回框;
}
公共布尔goFrame(){
框架。添加(面板);
frame.pack();
frame.setState(JFrame.ICONIFIED);
frame.setVisible(true);
返回true;
}
受保护的void createFrame(){
frame=新的JFrame();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
void toPanel(){
框架。移除(面板);
frame.dispose();
所有者。添加(面板);
owner.revalidate();
owner.repaint();
}
公共JPanel createSimplePanelInterface(){
JPanel p=新的JPanel();
JButton close=新JButton(“X”);
JButton最小化=新JButton(“”);
JButton最大化=新JButton(“[]”);
p、 添加(关闭);
p、 添加(最小化);
p、 添加(最大化);
close.addActionListener(新建ActionListener()){
@凌驾
已执行的公共无效行动(行动事件ae){
如果(最大化){
最大化=错误;
setGlassPane(新的JComponent(){
});
ownerFrame.revalidate();
ownerFrame.repaint();
}否则{
removePanelFromOwner();
getFrame().dispose();
}
}
});
最小化.addActionListener(新建ActionListener()){
@凌驾
已执行的公共无效行动(行动事件ae){
如果(最大化){
最大化=错误;
setGlassPane(新的JComponent(){
});
所有者。添加(面板);
owner.revalidate();
owner.repaint();
ownerFrame.revalidate();
ownerFrame.repaint();
}否则{
removePanelFromOwner();
goFrame();
frame.setState(frame.ICONIFIED);
}
}
});
maximize.addActionListener(新ActionListener()){
@凌驾
已执行的公共无效行动(行动事件ae){
如果(最大化){
返回;
}
最大化=真实;
removePanelFromOwner();
所有者框架。玻璃板(面板);
ownerFrame.revalidate();
ownerFrame.repaint();
面板设置可见(真)//
}
});
p、 设置顺序(新线条边框(颜色为黑色));
返回p;
}
私有void removePanelFromOwner(){
移除(getPanel());
owner.revalidate();
owner.repaint();
}
抽象JPanel createPanel();
}
我建议您创建一个internalframe,然后添加按钮。如果您不想添加按钮,则将internalframe参数设置为true
import java.awt.Dimension;
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.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, 400);
}
};
frame.setContentPane(jdp);
frame.pack();
createAndAddInternalFrame(jdp, 0, 0);
createAndAddInternalFrame(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);
}
}
我认为你在上一个问题中描述的类似方式,我会使用BoxLayout(接受最小值、最大值和首选值)