Замена JPanel на JPanel в JFrame - PullRequest
7 голосов
/ 25 июня 2011

У меня есть класс, который расширяет JFrame, и у него есть BorderLayout.У него есть две частные переменные экземпляра типа JPanel.Они представляют собой панели кнопок и называются flipButton и trustButtons.При нажатии на кнопку панель кнопок заменяется другой панелью кнопок.То есть, если вы щелкнете по кнопке в flipButton, flipButton будет заменен на trustButtons.Я попытался сделать это следующим образом:

  private class FlipListener implements ActionListener{
    public void actionPerformed(ActionEvent e){
      remove(flipButton); 
      add(confidenceButtons,BorderLayout.SOUTH);
      validate();
      ...
    }
  } 
  private class ColorListener implements ActionListener{
    ...
    public void actionPerformed(ActionEvent e){
      ...
      remove(confidenceButtons); 
      add(flipButton,BorderLayout.SOUTH);
      validate();
    }
  }

Кнопки в flipButton имеют FlipListeners, а кнопки в секрете - ColorListeners.Когда программа запущена, нажатие на кнопку удалит панель, но ничего не будет добавлено, чтобы заменить ее.Что я делаю неправильно?

РЕДАКТИРОВАТЬ

CardLayout оказался простым и легким решением.Оказывается, что приведенный выше код работает;проблема была опечатка в другом разделе моего кода.>. <Однако, у меня всегда были проблемы с использованием этих методов, и CardLayout, я считаю, упрощает это для меня.Благодарю.</p>

Ответы [ 3 ]

7 голосов
/ 25 июня 2011

Используйте CardLayout , как показано здесь .

Game view High Scores view

5 голосов
/ 25 июня 2011

revalidate () + repaint () должно быть уловкой, например здесь

EDIT:

чувствую, что у вас есть проблемы с этим, примеры для здесь и здесь и снова пример от trashgod , не стесняйтесь строить свой вопрос на основе код еще раз

Другой способ - взглянуть на отличный пример, добавленный Эндрю Томпсоном :-) + 1

1 голос
/ 25 июня 2011

попробуйте использовать getContentPane () для вызова методов remove (), add () и т. Д.:

getContentPane().remove(flipButton); 
getContentPane().add(confidenceButtons,BorderLayout.SOUTH);   
getContentPane().revalidate();
getContentPane().repaint();

Edit: этот код ниже работает для меня:

import java.awt.BorderLayout;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class Frame extends JFrame {
JPanel flipButton =new JPanel();
JPanel confidenceButtons =new JPanel();



    public Frame() throws HeadlessException {
    super();
    this.setLayout(new BorderLayout());
    JButton b1=new JButton("flip");
    b1.addActionListener(new FlipListener());
    flipButton.add(b1);

    JButton b2=new JButton("color");
    b2.addActionListener(new ColorListener());
    confidenceButtons.add(b2);
    this.getContentPane().add(flipButton,BorderLayout.SOUTH);
    this.setSize(250,250);
    this.pack();
    this.setVisible(true);

}
    private class FlipListener implements ActionListener{
        public void actionPerformed(ActionEvent e){
          remove(flipButton); 
          add(confidenceButtons,BorderLayout.SOUTH);
          validate();
          repaint();

        }
      } 
      private class ColorListener implements ActionListener{

        public void actionPerformed(ActionEvent e){

          remove(confidenceButtons); 
          add(flipButton,BorderLayout.SOUTH);
          validate();
          repaint();
        }
      }
    /**
     * @param args
     */
    public static void main(String[] args) {
        new Frame();

    }

}
...