// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= DevFaqWindowsMaximizeViaCode
:jbake-type: wiki
:jbake-tags: wiki, devfaq, needsreview
:jbake-status: published
:keywords: Apache NetBeans wiki DevFaqWindowsMaximizeViaCode
:description: Apache NetBeans wiki DevFaqWindowsMaximizeViaCode
:toc: left
:toc-title:
:syntax: true

=== How to maximize a TopComponent?

Example: How to open the output window in maximized state?

[source,java]
----

//----open/focus the TC "OutputWindow"
TopComponent tc = WindowManager.getDefault().findTopComponent("output");
if (!tc.isOpened()){ tc.open();}
tc.requestActive();

//----invoke the maximize action on the previously focused TC
//new way >=7.2
Action action=org.openide.awt.Actions.forID("Window", "org.netbeans.core.windows.actions.MaximizeWindowAction"); 
//OLD way <7.2
//Action action = FileUtil.getConfigObject("Actions/Window/org-netbeans-core-windows-actions-MaximizeWindowAction.instance", Action.class);

action.actionPerformed(null);
----

"But it's a hack, not a pretty API:) "

PS: For minimize use

[source,java]
----

 Action action=org.openide.awt.Actions.forID("Window", "org.netbeans.core.windows.actions.MinimizeWindowAction"); 
----

Taken from platform-dev mailing list

=== Apache Migration Information

The content in this page was kindly donated by Oracle Corp. to the
Apache Software Foundation.

This page was exported from link:http://wiki.netbeans.org/DevFaqWindowsMaximizeViaCode[http://wiki.netbeans.org/DevFaqWindowsMaximizeViaCode] , 
that was last modified by NetBeans user Markiewb 
on 2013-06-08T07:58:56Z.


*NOTE:* This document was automatically converted to the AsciiDoc format on 2018-02-07, and needs to be reviewed.
