jinternalframeの右上隅にある最小化/最大化ボタンをクリックせずに、JinternalFrameを最小化/最大化する方法はありますか?ボタンをクリックしないでJinternalフレームを最小化する
私は、具体的
jinterframe.setIcon(false)
を設定するが、私は動作しませんでした、このスレッドprogrammatically minimize a JInternalFrame?を追いました。
ありがとうございました。
jinternalframeの右上隅にある最小化/最大化ボタンをクリックせずに、JinternalFrameを最小化/最大化する方法はありますか?ボタンをクリックしないでJinternalフレームを最小化する
私は、具体的
jinterframe.setIcon(false)
を設定するが、私は動作しませんでした、このスレッドprogrammatically minimize a JInternalFrame?を追いました。
ありがとうございました。
私は期待通りの作品は、あなたがJInternalFrame#isIconifiable()をチェックする必要が(eeerghtこの拒否権は****本当にある)
import java.awt.*;
import java.awt.event.*;
import java.beans.PropertyVetoException;
import javax.swing.*;
import javax.swing.plaf.basic.*;
public class InternalFrameUnMovable extends JFrame {
private static final long serialVersionUID = 1L;
public JDesktopPane desktop;
public InternalFrameUnMovable() {
desktop = new JDesktopPane();
getContentPane().add(desktop);
desktop.add(createInternalFrame(1, Color.RED));
desktop.add(createInternalFrame(2, Color.GREEN));
desktop.add(createInternalFrame(3, Color.BLUE));
}
private JInternalFrame createInternalFrame(int number, Color background) {
JInternalFrame internal = new JInternalFrame("Frame" + number, true, true, true, true);
internal.setBackground(background);
internal.setVisible(true);
int location = 50 * number;
internal.setBounds(location, location, 300, 300);
return internal;
}
public static void main(String args[]) throws PropertyVetoException {
InternalFrameUnMovable frame = new InternalFrameUnMovable();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setSize(600, 600);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
try {// Activate first internal frame
JInternalFrame[] frames = frame.desktop.getAllFrames();
frames[0].setSelected(true);
} catch (java.beans.PropertyVetoException e) {
}
JInternalFrame[] frames = frame.desktop.getAllFrames();// Make first internal frame unmovable
for (int i = 0; i < frames.length; i++) {
JInternalFrame f = frames[i];
if (f.isIconifiable()) {
f.setIcon(true);
}
}
/*JInternalFrame f = frames[0];
BasicInternalFrameUI ui = (BasicInternalFrameUI) f.getUI();
Component north = ui.getNorthPane();
//MouseMotionListener[] actions = (MouseMotionListener[]) north.getListeners(MouseMotionListener.class);
MouseMotionListener[] actions = north.getListeners(MouseMotionListener.class);
for (int i = 0; i < actions.length; i++) {
north.removeMouseMotionListener(actions[i]);
}*/
}
}
方法getAllFrames()
は、「アイコン化フレームだけでなく、拡張されたフレームを返します。 " Mac OS Xでは、アイコン化されたフレームは無視されることがあります。以下の例は、異常を示し、補正するためにList<JInternalFrame>
を採用しています。
import java.awt.*;
import java.awt.event.*;
import java.beans.PropertyVetoException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
/**
* @see http://stackoverflow.com/q/9414728/230513
* @see http://stackoverflow.com/a/9415197/230513
*/
public class InternalFrameCount extends JFrame {
private static final int SIZE = 300;
private static final String ICONIFY = "Iconify";
private static final String RESTORE = "Restore";
private static final String COUNT = "Count:";
private JDesktopPane desktop = new JDesktopPane();
private JLabel count = new JLabel(COUNT);
private List<JInternalFrame> list = new ArrayList<JInternalFrame>();
public InternalFrameCount() {
desktop.add(createInternalFrame(1, Color.RED));
desktop.add(createInternalFrame(2, Color.GREEN));
desktop.add(createInternalFrame(3, Color.BLUE));
this.add(desktop);
JPanel panel = new JPanel();
panel.add(new JButton(new ButtonAction(ICONIFY)));
panel.add(new JButton(new ButtonAction(RESTORE)));
panel.add(count);
this.add(panel, BorderLayout.SOUTH);
count.setText(COUNT + desktop.getAllFrames().length);
}
private class ButtonAction extends AbstractAction {
private boolean iconify;
public ButtonAction(String name) {
super(name);
iconify = ICONIFY.equals(name);
}
@Override
public void actionPerformed(ActionEvent ae) {
for (JInternalFrame jif : list) {
try {
jif.setIcon(iconify);
} catch (PropertyVetoException e) {
e.printStackTrace(System.err);
}
}
count.setText(COUNT + desktop.getAllFrames().length);
}
}
private JInternalFrame createInternalFrame(int number, Color background) {
JInternalFrame jif = new JInternalFrame(
"F" + number, true, true, true, true);
list.add(jif);
jif.setBackground(background);
int topLeft = SIZE/10 * number;
jif.pack();
jif.setBounds(topLeft, topLeft, SIZE/2, SIZE/2);
jif.setVisible(true);
return jif;
}
public static void main(String args[]) throws PropertyVetoException {
System.out.println(System.getProperty("os.name"));
System.out.println(System.getProperty("java.runtime.version"));
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
InternalFrameCount frame = new InternalFrameCount();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.pack();
frame.setSize(SIZE, SIZE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
1あなたの例で暗黙のうちに '再描画を()'呼び出します。 OPの結果を説明するかもしれませんか? – trashgod
@trashgod私はあなたの質問に答えることができません、私は木のための森林を見ることができません、私はデスクトップAPIの唯一の観光客です(この場合)私はEDTの作品も、奇跡が再描画)がデスクトップに実装されました:-)、 – mKorbel
奇跡はありません。私は誤解しました。 – trashgod