繁体   English   中英

如何使JFrame自动调整大小以显示所有按钮

[英]How can I make JFrame resize automatically to display all buttons

我有一个简单的swing应用程序,其中包括一个JLabel和三个按钮。 这三个按钮位于它们自己的JPanel中,该JPanel与JLabel一起位于JFrame中。 JPanel使用flowlayout管理器水平排列按钮,JFrame使用BorderLayout管理器垂直排列JLabel和JPanel。

我的问题是,当我启动该应用程序时,在使用过程中,按钮之一上的文本会更改,这会增加其宽度。 但是,该窗口不会调整大小以适应此操作,并且其中一个按钮消失了。 我曾想过再次调用pack(),但JFrame是构造函数中的局部变量,而且,我不必告诉我的程序来调整大小,对吗? 我在Google或这里找不到任何帮助的方法,但是必须有一个简单的解决方案,我想念的是什么? 代码如下。

    playButton = new JButton("Play");
    pauseButton = new JButton("Pause");
    stopButton = new JButton("Stop");
    curTrackLabel = new JLabel("No Track Selected");

    JFrame myFrame = new JFrame("MediaPlayer");
    myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    myFrame.setTitle("MediaPlayer");
    myFrame.setLocation(400,300);

    JPanel topPanel = new JPanel();
    topPanel.setLayout(new BorderLayout());
    myFrame.add(topPanel);
    JPanel buttonPanel = new JPanel(new FlowLayout());

    buttonPanel.add(playButton);
    buttonPanel.add(pauseButton);
    buttonPanel.add(stopButton);
    topPanel.add(buttonPanel, BorderLayout.CENTER);
    topPanel.add(curTrackLabel, BorderLayout.NORTH);

    playButton.addActionListener(new playButtonHandler());
    pauseButton.addActionListener(new pauseButtonHandler());
    stopButton.addActionListener(new stopButtonHandler());

    myFrame.pack();
    myFrame.setVisible(true);

也许尝试

((JFrame中)myButton.getTopLevelAncestor())包();

其中myButton是在执行期间修改其文本的按钮。

与学习任何GUI软件一样,最好进行实验。 尝试将嵌套的JPanels与BorderLayouts混淆。

最终,您将JPanel与BorderLayout一起使用(Flow Layout可以,但实际上在调整窗口大小时,它通常会失败)。 请参阅http://download.oracle.com/javase/tutorial/uiswing/layout/border.html,以了解有关BorderLayouts的更多信息。

现在,对于您的布局方案,应该遵循以下原则:

  1. 顶级容器:JFrame
  2. JFrame包含一个带有BorderLayout的JPanel(称为JPanel 1)。
  3. 这三个按钮应该位于单独的jPanel(JPanel 2)中。 JPanel 1应该将三个按钮添加为BorderLayout.CENTER。 这样,如果按钮更改其宽度和/或高度,则窗口将调整大小。
  4. JLabel应该添加为BorderLayout.LINE_START。

位于http://download.oracle.com/javase/tutorial/uiswing/layout/border.html的教程应对此提供帮助。 但通常使用以下命令:

  • 根据需要使用JPanel并嵌套JPanels
  • BorderLayout.CENTER将适应大小更改-这是关键! (这个实验)
  • JFrame仅应用作顶级容器(对于更复杂的GUI,这是正确的)。

如果您需要更多的灵活性,请查看JGoodies: http ://www.jgoodies.com/。 这更像是创建表单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM