我有一个程序可以创建2个面板,然后在其中放置一个标签和两个按钮。标签设置为不可见setVisible(false)
,然后添加两个按钮并打包框架。当我点击第一个按钮时,会显示标签setVisible(true)
,而第二个标签会再次隐藏setVisible(false)
。当我点击每个按钮时,它们移动以填充标签隐藏的空间,然后再次移动以避开标签显示的方式。我想阻止这种情况发生,即使标签被隐藏,按钮也会保持在同一个位置。
这是代码:
public class MainFrame extends JFrame{
public JLabel statusLabel;
public JButton show;
public JButton hide;
public MainFrame(){
super("MagicLabel");
JPanel topPanel = new JPanel(); //Create Top Panel
statusLabel = new JLabel(""); //Init label
statusLabel.setVisible(false); //Hide label at startup
topPanel.setSize(400, 150); //Set the size of the panel, Doesn't work
topPanel.add(statusLabel); //Add label to panel
JPanel middlePanel = new JPanel(); //Create Middle Panel
show= new JButton("Show"); //Create show button
hide= new JButton("Hide"); //Create hide button
middlePanel.setSize(400, 50); //Set the size of the panel, Doesn't work
middlePanel.add(show); //Add show button
middlePanel.add(hide); //Add hide button
this.add(topPanel, "North"); //Add Top Panel to North
this.add(middlePanel, "Center"); //Add Middle Panel to Center
addActionListeners(); //void:adds action listeners to buttons
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setBounds(100, 100, 512, 400);
this.setPreferredSize(new Dimension(400,200)); //Set size of frame, Does work
this.pack();
this.setVisible(true);
}
public void animateInstall(boolean var0){ //Void to show and hide label from action listeners
statusLabel.setVisible(var0);
sendWorkingMessage("Boo!");
}
public void sendWorkingMessage(String message){ //Void to set text of label
this.statusLabel.setForeground(new Color(225, 225, 0));
this.statusLabel.setText(message);
}
void addActionListeners(){
show.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
animateInstall(true);
}
});
hide.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
animateInstall(false);
}
});
}
答案 0 :(得分:4)
this.setPreferredSize(new Dimension(400,200));
this.setMinimumSize(new Dimension(400,200));
所以pack()
不能干涉。
答案 1 :(得分:2)
使用CardLayout
。添加JLabel
并清空JPanel
。而不是将其设置为可见/不可见,在必要时交换显示JLabel
或JPanel
的卡片。
答案 2 :(得分:2)
不建议扩展JFrame,更好地扩展JPanel将所有组件放入其中,然后将其添加到JFrame
您需要了解如何使用SwingUtilities.invokeLater()
:请参阅example您应该如何使用
您需要了解Layout
:Tutorial
代码中非常愚蠢和简单的方法是:
this.statusLabel.setForeground(bgColor); //background color
this.statusLabel.setText(" "); //some number of characters
答案 3 :(得分:2)
默认情况下,您正在使用BorderLayout
。您可以尝试使用:
this.add(topPanel, BorderLayout.NORTH); //Add Top Panel to North
this.add(middlePanel, BorderLayout.SOUTH); //Add Middle Panel to South
而不是中心。
或者您可以为这两个面板创建一个中间容器面板,或考虑其他布局管理器,如BoxLayout
等