我正在编写一个试图模拟物种进化的程序,它有一个如下所示的窗口:
最初右下方的空白区域是一个面板,它旨在绘制样本,位置和行进路径的视觉表示(并不重要)。但是,您将能够打开某种窗口,允许您创建/编辑不同的项目(如物种,位置和旅行路径)。最初我计划那些只是弹出窗口。但是,我想我可能会使用JInternal窗格来显示弹出窗口和可视化表示屏幕。
所以在我的JFrames构造函数中:
JDesktopPane pane = new JDesktopPane();
this.setContentPane(pane);
setLayout(new BorderLayout());//To layout the menubar, and the items on the left
panel = new GraphicsPanel(manager);
panel.setVisible(true);
在图形面板构造函数中:super("Graphic Project View",true,false,true,true);
这会将Panel锁定到BorderLayout.CENTER,它会填满整个空间,不允许任何其他内容。我的猜测是因为JDesktopPanes使用OverlayLayout,当我将布局设置为BorderLayout时会覆盖OverlayLayout,因此我的InternalFrame只会被添加到中心。
所以问题是: 我如何布置像JMenuBar这样的东西,以及现在的左侧病房面板,同时仍然保持JInternalFrames的能力?
现在我将通过JFrame.setJMenuBar(JMenuBar)而不是JFrame.add(menuBar,BorderLayout.NORTH)添加JMenuBar,然后将左侧的面板更改为JInternal框架,但如果可能的话,我会我宁愿按原样使用它。如果我可以将DesktopPane添加到BorderLayout.CENTER的JFrame中,然后只需将框架添加到桌面窗格,我想要它。如果内部框架仅限于该区域,我会不在乎,只要它仍然可移动,等等。
编辑:我如何添加JInternalFrame(很抱歉它仍然说面板,但它已被转换为JInternalFrame):
panel = new GraphicsPanel(manager);
panel.setSize(desktop.getSize());
panel.setLocation(0,0);
panel.setVisible(true);
desktop.add(panel);
答案 0 :(得分:3)
我会从单个JPanel
开始(让它全部放在基础窗格中),这将容纳其他容器。
使用边框布局,我会将“控件”面板添加到基本窗格的WEST
位置。在CENTER
位置,我会添加JDesktopPane
。
我将主窗口布局设置为BorderLayout
并将基础窗格添加到其中。这将允许您使用JFrame#setJMenuBar
管理菜单栏,同时保持布局的结果。
这将允许您包含使用桌面上的JInternalFrame
而不影响其余的布局......
简单示例
这是一个过于简化的例子,用于演示上述基本概念......
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class SimpleLayout {
public static void main(String[] args) {
new SimpleLayout();
}
public SimpleLayout() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JMenuBar mb = new JMenuBar();
mb.add(new JMenu("File"));
mb.add(new JMenu("Add"));
mb.add(new JMenu("Edit"));
mb.add(new JMenu("Analize"));
mb.add(new JMenu("About"));
JFrame frame = new JFrame("Testing");
frame.setJMenuBar(mb);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new BasePane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class BasePane extends JPanel {
private JTextArea species;
private JTextArea locations;
private JTextArea travelPaths;
private JDesktopPane desktopPane;
public BasePane() {
setLayout(new BorderLayout());
desktopPane = new JDesktopPane();
species = new JTextArea("Species");
locations = new JTextArea("Locations");
travelPaths = new JTextArea("TravelPaths");
JPanel controls = new JPanel(new GridLayout(3, 0));
controls.add(new JScrollPane(species));
controls.add(new JScrollPane(locations));
controls.add(new JScrollPane(travelPaths));
add(controls, BorderLayout.WEST);
add(desktopPane);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
}
}
您的要求可能略有不同,但基本概念应该让您感动。
根据应用程序的结构,我可能会将Controls
窗格分成单独的类。