我有一个简单的swing应用程序,它包含一个JLabel和三个按钮 . 这三个按钮位于自己的JPanel中,它与JLabel一起位于JFrame中 . JPanel使用flowlayout管理器水平排列按钮,JFrame使用BorderLayout管理器垂直排列JLabel和JPanel .
我的问题是当我启动应用程序时,在使用过程中,其中一个按钮上的文本发生变化,这会增加其宽度 . 但是,窗口没有调整大小以适应这个并且其中一个按钮消失 . 我想再次调用pack(),但JFrame是我的构造函数中的局部变量,同样,我不应该告诉我的程序调整大小,对吧?我一直无法在谷歌或这里找到任何帮助我,但必须有一个简单的解决方案,我错过了什么?代码如下 .
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);
2 回答
也许试试吧
((JFrame中)myButton.getTopLevelAncestor())包();
其中myButton是在执行期间修改其文本的按钮 .
与学习任何GUI软件一样,实验也是最好的 . 尝试使用嵌套的JPanels搞乱BorderLayouts .
最终,你使用带有BorderLayout的JPanel(Flow Layout是可以的,但实际上在调整窗口大小时,它会非常失败) . 请参阅http://download.oracle.com/javase/tutorial/uiswing/layout/border.html以了解有关BorderLayouts的更多信息 .
现在,对于您的布局方案,它应该是以下内容:
顶级容器:JFrame
JFrame包含一个带有BorderLayout的JPanel(调用此JPanel 1) .
三个按钮应位于SEPARATE jPanel(JPanel 2)中 . JPanel 1应该将三个按钮添加为BorderLayout.CENTER . 这样,如果按钮改变其宽度和/或竖直,窗口将调整大小 .
JLabel应添加为BorderLayout.LINE_START .
以下教程:http://download.oracle.com/javase/tutorial/uiswing/layout/border.html应该对此有所帮助 . 但一般来说,使用以下内容:
根据需要使用JPanel并嵌套JPanel
BorderLayout.CENTER将适应尺寸变化---这是关键! (试验这个)
JFrame只能用作顶级容器(对于更复杂的GUI,这是真的) .
如果您需要更多灵活性,请查看JGoodies:http://www.jgoodies.com/ . 这更像是创建表单的方式 .