28. april 2004 - 11:33Der er
22 kommentarer og 1 løsning
Slette indhold i et jPanel
I tidligere spg. http://www.eksperten.dk/spm/493634 fandt jeg ud af hvordan man kan kalde en anden klasse og sætte ind i et jPanel. Så langt så godt.... :O)
Nu har jeg så 3 klasser som har mulighed for at komme ind i dette jpanel, alt efter om man trykker på Jbutton 1 2 eller 3 (eks. en hovedmenu, som kan vise 3 andre skærmbilleder i et jPanel,
Problemet består i at det hele til sidst står oven i hinanden, hvis jeg har trykket på alle 3 Jbuttons. (Når jeg arbejder med Jpanels inden for den samme klasse kan jeg styre det med setVisible(); metoden).
1) Hvordan kan jeg få det til at virke når indholdet er hentet fra en anden klasse?
Dette skal fjernes igen ved tryk på jButton 2 eller 3 (alt indhold vises i det samme jPanel) jButton skal kunne fjerne det gamle indhold, samtidigt med at det nye vises.
2) Er der i det hele taget en smartere metode man kan bruge frem for setVisible(); da den bliver ret omfattende hvia der er mange jPaneler og jButtons der er i spil i samme klasse. Det ender tit med at se ud som følger:
private void addPanel(java.awt.event.ActionEvent evt) { rydOp(); jPanel1.add(pRed); jPanel1.validate(); // der er ingen grund til at kalde validate() før. }
Eksempel på CardLayout (ikke det bedste jeg har lavet, men det jeg lige kunne finde) jeg når nok ikke mere i dag, så jeg håber du får det bedste ud af det
public TestCardLayout() { initComponents(); setSize(500,500); }
private void initComponents(){ panelWest = new JPanel(); panelEast = new JPanel(); panel2 = new Panel2(); panel3 = new Panel3(); panel4 = new Panel4();
menuBar = new JMenuBar(); menu = new JMenu(); item2 = new JMenuItem(); item3 = new JMenuItem(); item4 = new JMenuItem();
_carsten Jeg har forsøgt at putte din rydOp metode ind i min kode, men den virker kun delvis. Jeg har forsøgt at beskrive det hele lidt nærmere her under.
GUI_Hovedmenu Der findes 3 knapper til at starte med i et panel. Administration af testbesvarelser (kalder et andet panel (1) i samme klasse) Virker Administration af Items (kalder et andet panel (2) i samme klasse) Virker Eksport (kalder et andet panel i en anden klasse) Virker
(1) admAfTestbesvarelser Panel med 2 knapper Opret ny testbesvarelse (kalder et andet panel i en anden klasse) Virker Rediger testbesvarelse (ikke færdiggjort endnu)
(2) admAfItems Panel med 3 knapper Tilføj nyt item (kalder et andet panel i en anden klasse) Redigering af item (ikke færdiggjort endnu) Slet item (ikke færdiggjort endnu)
Man kan sige at der findes 3 lag i alt (lag 1 øverst, lag 2 lige neden under, lag 3 overlapper lag 2 og fylder resten ud neden under), som der skal holdes styr på, mit problem ligger ikke i at vise de forskellige ting, men derimod at jeg ikke kan bevæge mig mellem de 3 lag og undgå at tingene lægger sig oven i hinanden.
Planen er at jeg vil benytte cardlayout til lag 3 som skal indeholde en hel masse ”sider” som man kan bevæge sig frem og tilbage i, alt efter knapvalg i bunden
For det skal være nemmere at forstå, har jeg uploadet nogle billeder der kan ses ved tryk på følgende links Lag1 http://www.upit.dk/files/pic1.JPG
Næste indlæg viser koden for GUI_Hovedmenu som indeholder de forskelige jButtons. Koden under hver enkelt knap vil nok virke rodet og tilfældig, men det skyldes en voksende hovedpine og øget frustration :O)
//*********Skal flyttes over i vores rigtige main klasse senere******* import javax.swing.UIManager; //********************************************************************
public class GUI_Hovedmenu extends javax.swing.JFrame {
/** Creates new form GUI_Hovedmenu */ public GUI_Hovedmenu() { initComponents(); }
/** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ private void initComponents() { hovedmenuVenstre = new javax.swing.JPanel(); logo = new javax.swing.JLabel(); logo.setVisible(false); hovedmenuTop = new javax.swing.JPanel(); admTestbesvarelse = new javax.swing.JButton(); admItem = new javax.swing.JButton(); eksport = new javax.swing.JButton(); admAfTestbesvarelser = new javax.swing.JPanel(); admAfTestbesvarelser.setVisible(false); nyTestbesvarelse = new javax.swing.JButton(); RedigeringAfTestbesvarelse = new javax.swing.JButton(); admAfItems = new javax.swing.JPanel(); admAfItems.setVisible(false); tilfoejNytItem = new javax.swing.JButton(); redigeringAfItem = new javax.swing.JButton(); sletItem = new javax.swing.JButton(); visHer = new javax.swing.JPanel(); ntb = new GUI_NyTestbesvarelse(); eks = new GUI_Eksport(); tni = new GUI_TilfoejNytItem();
Fejl1 Har trykket på "Administration af testbesvarelser", herefter "Opret ny testbesvarelse", her er der så problemer med at det panel indeholdende "Opret ny Testbesvarelse" & "Rediger testbesvarelse" ikke forsvinder.
Fejl2 Har trykket på "Eksport" herefter på "Administration af items" her forsvinder indholdet fra "Eksport" ikke.
Fejl3 Har trykket på "Administration af items" herefter på "Tilføj nyt item" her forsvinder det panel indeholdende "Tilføj nyt item", "Rediger Item" & "Slet item" ikke.
Alle knapper viser det indhold der skal vises, men de formår ikke at fjerne det forgående igen.
Ideen i hvordan det burde virke: Som beskrevet tidligere ser jeg det som 3 lag.
1 lag panel med følgende knapper "Administration af testbesvarelser", Administration af items" & "Eksport" (dette lag skal altid være synligt)
(Til en hver tid når man trykker på en af disse 3 knapper skal alt i lag 2 & 3 fjernes, pånær det panel som den valgte knap er koblet sammen med.
2 lag (fremkommer lige nedenunder lag 1) Dette lag indeholder 2 mulige paneler med tilhørende knapper. Ideen er at de kommer frem ved tryk i første lag, men forsvinder igen ved tryk på en af de knapper der nu måtte være i lag 2. Samtidigt ved tryk på en vilkorlig knap i lag2 vises lag3 gældende for det indhold knapper i lag 2 beskriver.
(Til en hver tid når man trykker på en af de knapper som findes (2 paneler alt efter valg, 2 knapper på det ene og 3 på det andet), skal alt i lag 3 fjernes, pånær det panel som den valgte knap er koblet sammen med.
Knapper i lag1 henviser til andre paneler i samme klasse (pånær eksport, som henter indhold fra en anden GUI klasse)
Knapper i lag2 henter alle sammen indhold fra andre GUI klasser.
Lag3 viser det indhold der er hentet fra de andre GUI klasser.
Håber at det giver en eller anden form for mening :O)
Nu har jeg kun lige skimmet din kode, men du mangler en visHer.validate(); i admTestbesvarelseActionPerformed
Alternativt kan du tilføje en visHer.validate(); som sidste linie i rydOp(), der sker ikke andet validate() sommetider vil blive brugt en gang mere end det er nødvendigt.
Sidder og tænker lidt over om problemet ikke ligger i rydOp()
Den tager så vidt jeg kan se kun hensyn til Jpanel "visHer", men der er jo også det jPanel "admAfTestbesvarelser" i lag 2 som skal ryddes op i, og muligvis i lag 1 "hovedmenuTop" Prøver lige et par småting i den retning.....
for(int i = 0; i < comp.length; i++){ visHer.remove(comp[i]); } visHer.validate(); // Flyt udenfor løkke, der er ingen grund til gøre // før den færdig med fjerne komponenter }
Hmm...det hjalp desværre ikke, det er da lige til at få grå hår af. der sker følgende:
Jeg starter med at have de 3 knapper i lag 1, det hele virker hvis jeg starter med at trykke på hver knap fra venstre mod højre. efter af være nået til den højre knap "eksport" forsøger jeg så at gå tilbage igen **, her sker der så ikke noget ved tryk på den miderste knap "Administration af items" og ved tryk på den knap længst til højre kommer så lag 2 frem gældende for den knap.
**Efter tryk på knappen "eksport" forsvinder lag 3 ikke igen.
Så efter at have foretaget en test hvor jeg starter fra højre mod venstre og tilbage igen, står det hele oven på hinanden.
Ok, nu virker samspillet mellem knap 1 og 2 i lag 1, her kan jeg nu trykke frem og tilbage mellem de 2 knapper og lag 2 vises rigtigt i henhold til knapperne.
knappen eksport rydder stadigvæk ikke op efter sig, så det ser ud til at være det eneste problem i lag 1 lige pt.
Kan det være rydOp() der har et problem i sin opbygning når der hentes indhold fra andre klasser, virker lidt som om den bliver sat ud af spillet i de tilfælde.
Det jeg mente tidligere med metoden rydOp() var at når man har trykket på knappen "eksport" og lag 3 vises, så sker der ikke noget når man så efterfølgende trykker på knap 1 eller 2, og de har jo også rydOp() metoden (den burde vel fjerne indhold fra lag 3 "visHer" men det ser ikke ud som om dette sker.
Hmmmm....bøvl med databasen, nu er det 3 gang at jeg acceptere denne bescarelse på mit spg.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.