5

2 つのパネルを作成し、ラベルと 2 つのボタンを配置するプログラムがあります。ラベルが非表示に設定されsetVisible(false)、2 つのボタンが追加され、フレームがパックされます。最初のボタンをクリックすると、ラベルが表示され、2番目のボタン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);
        }
    });
  }
4

4 に答える 4

5
this.setPreferredSize(new Dimension(400,200));
this.setMinimumSize(new Dimension(400,200));

だからpack()干渉できない。

于 2013-01-04T06:28:55.527 に答える
2

JFrame の拡張はお勧めできません。JPanel を拡張してすべてのコンポーネントを内部に配置し、それを JFrame に追加することをお勧めします。

使い方を学ぶ必要がありますSwingUtilities.invokeLater():あなたがどのように見えるべきかの例を見てください

以下について学ぶ必要がありますLayout:チュートリアル

コードでの非常に愚かで簡単なアプローチは次のとおりです。

 this.statusLabel.setForeground(bgColor); //background color
 this.statusLabel.setText("           "); //some number of characters
于 2013-01-04T06:34:07.897 に答える
2

デフォルトでは、使用しているフレームのBorderLayout. 次のようなものを試すことができます:

this.add(topPanel, BorderLayout.NORTH);     //Add Top Panel to North
this.add(middlePanel, BorderLayout.SOUTH); //Add Middle Panel to South

中心ではなく。

または、これら 2 つのパネルの中間コンテナ パネルを作成するかBoxLayout、 などの他のレイアウト マネージャを検討することもできます。

于 2013-01-04T06:34:58.970 に答える