Замена JPanel в JFrame .. как ?

 
 
 
Сообщения:20
Тут столкнулся с вопросом, как заменить в JFrame одну JPanel с набором компонентов на другую.

К примеру есть такой код.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;


class TestFrame {

	JFrame frame;
	JPanel panel;

	public static void main (String[] args) {
		TestFrame tf = new TestFrame();
		tf.go();
	}
	
	public void go () {
		
		frame = new JFrame("TestFrame");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(500, 200);
		
		JButton button = new JButton("1");
		button.addActionListener(new ButtonListener());
		
		panel = new JPanel();
		panel.add(button);
		
		frame.add(panel);
		frame.setVisible(true);	
	}
	
	void go2() {
		frame.remove(panel);
		
		JButton button = new JButton("2");
		panel = new JPanel();
		panel.add(button);
		
		frame.add(panel);
		frame.repaint();
	}
	
	class ButtonListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			go2();
		}
	}

}

Идея такова, после того как нажимается кнопка 1 ... должна появится новая панель имеющая кнопку 2.
Но перерисовка приводит к пустому фрейму.
Что я делаю не верно ? Просто в книгах пока подобного не встречал что читаю, посему самостоятельно экспериментировал.
 
 
Сообщения:1402
Не знаю получится ли но попробуйте добавить в 38 строчку строку
panel.revalidate();
 
 
Сообщения:20
Получилось.
даже без frame.repaint();
Спасиб.

Только вопрос в том, вообще это верная идеология убивать одну панель во фрейме вставлять другую и перерисовывать ?
 
 
Сообщения:1402
Ну не знаю насколько верно, но если ваша задача состоит в замене кнопок, то можно создать массив класса из 2 кнопок и настроить их. А по нажатию кнопки вместо замены панелей, убрать кнопку с панели и добавить на нее другую кнопку.
 
 
Сообщения:20
Кнопки были просто для быстрого примера.
А вот если к примеру слева колонка с меню а с права отображаются страницы с разной информацией, ну к примеру как классическая структура меню настроек программы.
В данном случае как я понимаю как раз таки и потребуется менять правую панель на которой собраны все необходимые компоненты соответственно выбранного меню ?
 
 
Сообщения:1402
Если меняются панели одного типа, то почему бы просто не менять содержимое этой панели? А если панели разные по структуре, то можно реализовать свой абстрактный класс от JPanel, с помощью которого потом реализовывать классы с нужной функциональостью.
 
 
Сообщения:10
Подскажите пожалуйста советом! Тоже стоит задача смена JPanel. Имеется вот такая структура:
Класс Device
abstract public class Device {
    private String name;
    private int id;
    private String type;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
    
    @Override
    public String toString() {
        return getName();
    }
}

Класс SingleTemperature
public class SingleTemperature extends Device {
    private int temp;

    public SingleTemperature(String name, int id, String type) {
        setName(name);
        setId(id);
        setType(type);
    }

    public int getTemp() {
        return temp;
    }

    public void setTemp(int temp) {
        this.temp = temp;
    }
}

Класс Batch
public class Batch extends Device{
   
    public Batch(String name, int id, String type){
        setName(name);
        setId(id);
        setType(type);
    }

    public void getTemp(){
        System.out.println("Test");
    }
   
}

И класс GUI

Сначала мы выбираем тип добавляемого устройства в данном случае это "Баня" и "Темпер" соответственно им принадлежат классы Batch и SingleTemperature. потом присваиваем им Имя и ID номер, после чего по кнопке ОК создаем объект, помещаем его в List<Device> и выводим имя в JList. Сейчас стоит задача при выборе в JList элемента, менять центральную панель! Получается для каждого типа устройства, будет своя панель. Стоит ли каждому добавляемому устройству, создавать свою панель? Или стоит создать для каждого типа устройства создать панель и у однотипных устройств менять только данные! К примеру SingleTemperature может быть сколько угодно, на рисунке это Температура1 и 2, но панель отображения для них одна и та же и мы просто у этой панели меняем значения.
Как можно такое реализовать, что-то у меня пока что голова не соображает..
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет