Widoczność Paneli na Formatce

0

Witam, mam problem z widocznością albo ponownym rysowaniem komponentów na formatce. W konstruktorze formatki tworzę i dodaję w ten sam sposób cztery (różne) panele np.

panel_dodaj = new Panel("dodawanie");
powZawartosci.add(BorderLayout.CENTER,panel_dodaj);

W BorderLayout.SOUTH mam panel z buttonami które powinny mi ustawiać widoczność na jeden z paneli. W konstruktorze do klasy Panel próbowałem już ustawiać setVisible (false) lub show(false) a w buttonach ustawiałem odpowiednią wartość na truepanel_dodaj.setVisible(true); ale w dalszym ciągu nie jestem w stanie podmienić raz wyświetlonego panelu na inny. Gdy w konstruktorze Paneli wszystkich za wyjątkiem jednego ustawiłem Visible lub show na true a potem buttonem zmieniałem na false panel znikał. Doczytałem że to może być wina odświeżania formatki, ale funkcje repain() lub invalidate() nie działały. W jaki sposób mogę w BorderLayout.CENTER na jednej formatce w zależności od buttona wyświetlać odpowiedni Panel?
Z góry dziękuje za pomoc!

0

Rzuć okiem na revalidate() wywoływaną na rzecz obiektu uzyskanego z getContentPane(). Mogę się mylić bo już późno i pomroczność po mnie biega, więc po prostu sprawdź.

0

Albo doLayout()

0

stworzyłem nowy projekt do testowania tego podmieniania paneli ale w dalszym ciągu to mi nie działa oto kod:

		dolny = new JPanel();
		this.add(BorderLayout.SOUTH,dolny);
		dolny.setBackground(Color.GREEN);
		JButton okay = new JButton("Okay");
		dolny.add(okay);
		
                srodek1 = new JPanel();
		srodek1.setBackground(Color.RED);
		srodek1.setVisible(false);
		this.add(BorderLayout.CENTER, srodek1);
		
		srodek2 = new JPanel();
		srodek2.setVisible(true);
		srodek2.setBackground(Color.ORANGE);
		this.add(BorderLayout.CENTER, srodek2);
		
		okay.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				
				srodek2.setVisible(false);
				srodek1.setVisible(true);
				invalidate();
				repaint();
				getContentPane().invalidate();
				getContentPane().validate();
				doLayout();
				getContentPane().doLayout();
				srodek1.revalidate();
				srodek2.revalidate();
			}
                  });

do buttona dodałem chyba wszystkie funkcje które powinny zadziałać, ale jedyne co się dzieje to znika mi panel srodek2 ale w jego miejsce nic się nie pokazuje

0

Nie rozumiesz jak działa metoda add() w BorderLayout.
Po sekwencji

add(pan1,BorderLayout.CENTER);
add(pan2,BorderLayout.CENTER);

nie ma śladu po pan1. Jeśli chcesz przełączać panele, to skonstruuj na starcie potrzebne panele, a w actionPerformed() wywołuj add(pewienPanel,BorderLayout.CENTER) a potem odświeżaj.

0
bogdans_niezalogowany napisał(a)

Nie rozumiesz jak działa metoda add() w BorderLayout.
Po sekwencji

add(pan1,BorderLayout.CENTER);
add(pan2,BorderLayout.CENTER);

nie ma śladu po pan1. Jeśli chcesz przełączać panele, to skonstruuj na starcie potrzebne panele, a w actionPerformed() wywołuj add(pewienPanel,BorderLayout.CENTER) a potem odświeżaj.

bogdans_niezalogowany możesz zamieścić przykładowy kod na podmianę w oknie panela w polu centralnym ?? Jak możesz podaj swój numer Gadu.

0

Mogę.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class D extends JFrame implements ActionListener
{
    private MyPanel[] panele=new MyPanel[10];;
    private int indeks=0;
    //------------------------
    public static void main(String[] args)
    {
        new D();
    }
    //------------------------
    public D()
    {
        super("Zmienianie paneli");
        for(int i=0;i<10;i++)
        {
            panele[i]=new MyPanel(i);
        }
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout(2,2));
        add(new JLabel("Góra",JLabel.CENTER),BorderLayout.NORTH);
        add(new JLabel("Lewo ",JLabel.CENTER),BorderLayout.WEST);
        add(new JLabel(" Prawo",JLabel.CENTER),BorderLayout.EAST);
        add(panele[indeks],BorderLayout.CENTER);
        JButton b=new JButton("Zmieniacz");
        b.addActionListener(this);
        add(b,BorderLayout.SOUTH);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }
    //------------------------
    public void actionPerformed(ActionEvent e)
    {
        remove(panele[indeks]);
        indeks++;
        indeks=indeks%10;
        add(panele[indeks],BorderLayout.CENTER);
        validate();
        pack();
    }
}
//------------------------------------------------
class MyPanel extends JPanel
{
    public MyPanel(int ile)
    {
        super();
        setLayout(new FlowLayout(FlowLayout.CENTER));
        StringBuffer sb=new StringBuffer("1");
        for(int i=0;i<ile;i++)
           sb.append("00");
        add(new JLabel(sb.toString(),JLabel.CENTER));
    }
}
0

Miałbym prośbę... mógłbyś odezwać się do mnie na Gadu? Mój numer to 1341105

0

Niestety nie, nie korzystam z komunikatorów.

0

Rozumiem, więc opiszę mój problem :)

Mam 4 klasy: Panel1, Panel2, MojeOkno i MojeMenu...

Moja aplikacja w menu ma zakładkę Panel, gdzie wybieramy albo panel1, albo panel2. Niestety nie potrafię tego dobrze zrobić...

Aktualnie mam rozwiązane to tak:

public class MojeOkno extends JFrame {

/**
 * @param args
 */
private Panel1 panel1;
private Panel2 panel2;

public MojeOkno(){
	super(" Moja aplikacja");
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	panel1 = new Panel1();
	panel2 = new Panel2();
	getContentPane().add(panel1,BorderLayout.CENTER);
	getContentPane().add(panel2,BorderLayout.SOUTH);
	setSize(new Dimension(500,300));
	setJMenuBar(new MojeMenu(panel1, panel2));	
	setVisible(true);
}

public void getCPane(){		
	System.out.println("OK");
	getContentPane().add(panel2,BorderLayout.CENTER);
}
public static void main(String[] args) {
	// TODO Auto-generated method stub
	new MojeOkno();
}	

}</span>


Słuchacz MenuBar:
private class Akcja extends AbstractAction{
public void actionPerformed(ActionEvent e){
if(e.getActionCommand().equals("Panel1")){
panel2.setVisible(false);
panel1.setVisible(true);
}
if(e.getActionCommand().equals("Panel2")){
panel1.setVisible(false);
panel2.setVisible(true);
}....

Niestety rozwiązanie to działa, źle ponieważ drugi Panel jest na południu i okno nie jest wypełnione w 100% :( Dodanie dwóch paneli jako BorderLayout.CENTER powoduje, że ten pierwszy w ogóle nie uruchamia się...

Dlatego próbowałem zrobić coś takiego:

public class MojeOkno extends JFrame {

/**
 * @param args
 */
private Panel1 panel1;
private Panel2 panel2;

public MojeOkno(){
	super(" Moja aplikacja");
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	panel1 = new Panel1();
	panel2 = new Panel2();
	getContentPane().add(panel1,BorderLayout.CENTER);
	//getContentPane().add(panel2,BorderLayout.SOUTH);
	setSize(new Dimension(500,300));
	setJMenuBar(new MojeMenu(panel1, panel2));	
	setVisible(true);
}

public void getCPane(){		
	System.out.println("OK");
	getContentPane().add(panel2,BorderLayout.CENTER);
}
public static void main(String[] args) {
	// TODO Auto-generated method stub
	new MojeOkno();
}	

}</span>


Słuchacz MenuBar:
private class Akcja extends AbstractAction{
public void actionPerformed(ActionEvent e){
if(e.getActionCommand().equals("Panel1")){
panel2.setVisible(false);
add(panel2,BorderLayout.CENTER);
panel1.setVisible(true);
}
if(e.getActionCommand().equals("Panel2")){
panel1.setVisible(false);
add(panel1,BorderLayout.CENTER);
panel2.setVisible(true);
}....

Niestety takie rozwiązanie powoduję, że Panel1 lub Panel2 (w zależności od wyboru) jest dodawany do paska menu zamiast poniżej... użycie getContentPane().add(panel1,BorderLayout.CENTER); w słuchaczu menu nie wchodzi w grę, ponieważ nie widzi funkcji getContentPane()

Proszę o pomoc, bo już nie mam koncepcji żadnej... dziękuję :)

0

A Ty próbowałeś zrozumieć mój kod?

    public void actionPerformed(ActionEvent e)
    {
        //jeśli należy usunąć panel1 i wyświetlić panel2
        remove(panel1);
        add(panel2,BorderLayout.CENTER);
        validate();
        pack();
   }

Jeśli program będzie uruchamiany na Javie w wersji>=1.4, to można

add(panel2,BorderLayout.CENTER);

nie trzeba

getContentPane().add(panel2,BorderLayout.CENTER);
0

Ehhh tylko że u mnie Panele są przełączane w zupełnie innej klasie (MojeMenu)... i użycie add powoduje dodanie panela do paska menu...

0

To przekaż do klasy MojeMenu (np. w konstruktorze) referencję do klasy z wymienianymi panelami. Niech ta referencja nazywa się ppp.

        ppp.remove(ppp.panel1);
        ppp.add(ppp.panel2,BorderLayout.CENTER);
        ppp.validate();
        ppp.pack();

Jeśli pola panel1 (panel2) są prywatne, to

        ppp.remove(ppp.getPpanel1());
        ppp.add(ppp.getPanel2(),BorderLayout.CENTER);
0

Próbowałem twoim sposobem, moim sposobem i zawsze mam ten sam błąd :(

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at MojeMenu$Akcja.actionPerformed(MojeMenu.java:77)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.AbstractButton.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

0

Wyślij cały kod na maila.

0

To proszę podaj e-maila :)

0

Na razie nie zdałeś testu na inteligencję ;-) . Ale kombinuj.

0

Nie jestem zarejestrowany i nie chcę się rejestrować... Odezwij się na mojego [email protected] i CI prześlę program

1 użytkowników online, w tym zalogowanych: 0, gości: 1