ToogleButton einbauen

mavinatic

Bekanntes Mitglied
Hallo Community,

ich habe eine Frage, ich habe einen JButton und möchte nun ein toggle-Verhalten programmieren, dass heißt, wenn ich draufdrücke wird Panel a gezeichnet und nochmal drücke das anfangsPanel. Jedoch kann ich das 1 mal öffnen dann bleibts hängen?! Wo ist der Fehler? Ich kanns mir nicht erklären?!

Java:
if(button.getName().equals("Read Mail")) {
			if(readMode) {
				readMode=false;
				MailViewer viewer = new MailViewer();
				temp = panel.centerPanel;
				panel.centerPanel.removeAll();
				panel.centerPanel.add(viewer);
				panel.centerPanel.revalidate();
				panel.centerPanel.repaint();
			} else {
				readMode=true;
				if(temp!=null) {
					panel.add("Center",temp);
					panel.centerPanel.revalidate();
					panel.centerPanel.repaint();
				}
			}

Wäre nett wenn ihr es euch mal anschaut :) Danke im voraus

George
 

Volvagia

Top Contributor
Ohne den restlichen Code zu kennen: Du fügst beim Drücken mit !readMode nur hinzu. Das heißt, wenn der MainViewer vom readMode noch drauf ist, wird das Panel darunter (abhängig vom LayoutManager) hinzugefügt.
Es gibt übrigens bereits einen JToggleButton, der bleibt auch gedrückt.
 

mavinatic

Bekanntes Mitglied
MainPanelListener:

Java:
package org.mail.listener;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

import org.mail.gui.MailViewer;
import org.mail.gui.MainPanel;
import org.mail.request.Mail;
import org.mail.request.MailRequest;

public class MainPanelListener implements ActionListener {
	private MainPanel panel = null;
	private TreeNodeListener treeNode = null;
	private MailRequest request = null;
	private ArrayList<Mail> list = null;
	private boolean readMode = true;
	private JPanel temp = null;
	
	public MainPanelListener(MainPanel panel, TreeNodeListener listen, MailRequest request) {
		this.panel = panel;
		this.treeNode=listen;
		this.request=request;
	}
	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		JButton button = (JButton) arg0.getSource();
		
		if(button.getName().equals("Get Mail")) {
			if(treeNode.getSelectedTreeItem()!=null) {
				list = request.getMailsFromFolder(treeNode.getSelectedTreeItem());
			}
			
			String[][] data = new String[list.size()][];
			for (int i=0; i<list.size(); i++) {
			    Mail mail = list.get(i);
			    data[i] = new String[] { mail.getSubject(), mail.getSender(), mail.getSendDate()};
			}
			panel.updateTable(data);
		}
		if(button.getName().equals("Read Mail")) {
			if(readMode) {
				readMode=false;
				MailViewer viewer = new MailViewer();
				temp = panel.centerPanel;
				panel.centerPanel.removeAll();
				panel.centerPanel.add(viewer);
				panel.centerPanel.revalidate();
				panel.centerPanel.repaint();
			} else {
				readMode=true;
				if(temp!=null) {
					panel.add("Center",temp);
					panel.centerPanel.revalidate();
					panel.centerPanel.repaint();
				}
			}		
		}
		if(button.getName().equals("Delete Mail")) {
			System.out.println(panel.getSelectedTableRow());
		}
		if(button.getName().equals("Info")) {
			JOptionPane.showMessageDialog(panel, "MailClientINFO");
		}
	}

}

MainPanel:

Java:
package org.mail.gui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTree;
import javax.swing.table.DefaultTableModel;
import javax.swing.tree.DefaultMutableTreeNode;

import org.mail.listener.MainPanelListener;
import org.mail.listener.TreeNodeListener;
import org.mail.request.MailRequest;
import org.mail.request.RequestThread;

public class MainPanel extends JPanel {
	private JPanel naviPanel = new JPanel();
	public JPanel centerPanel = new JPanel();
	private JPanel controlPanel = new JPanel();
	private JPanel functionPanel = new JPanel();
	private JPanel folderPanel = new JPanel();
	private JScrollPane scrollPane = null;
	private JTree tree = null;
	private DefaultMutableTreeNode mainNode = null;
	private Color backgroundColor = new Color(104,131,139);
	private JTable table = null;
	
	/* Eigene Klassen */
	private MailRequest request = new MailRequest(null);
	
	/*Listener*/
	private TreeNodeListener treeNodeListener = new TreeNodeListener();
	private MainPanelListener listen = new MainPanelListener(this,treeNodeListener,request);
	
	/* TestData */
	private DefaultTableModel model = null;
	private String[] buttonText = new String[] {
		"Get Mail", "Read Mail", "Delete Mail", "Info"	
	};
	private String[] columnDescription = new String[] {
		"Betreff", "Absender", "Datum"	
	};
	private String[][] data = null;
	public String[] folders = null;
	
	public MainPanel() {
		this.updateFolders();
		this.setBackground(new Color(164,211,238));
		this.setLayout(new BorderLayout());
			
			controlPanel.setBackground(new Color(135,206,250));
			setCenterPanel();
			setNaviPanel();
			
		this.add("West", naviPanel);
		this.add("Center", centerPanel);
		this.add("South", controlPanel);
	}
	
	private void setCenterPanel() {
		centerPanel.setLayout(new GridLayout(1,1));
		model = new DefaultTableModel(data,columnDescription);
		table = new JTable(model);
		table.setRowHeight(30);
		table.setBackground(backgroundColor);
		scrollPane = new JScrollPane(table);
		scrollPane.setBackground(backgroundColor);
		scrollPane.setBorder(null);
		centerPanel.add(scrollPane);
	}
	private void setNaviPanel() {
		naviPanel.setLayout(new BorderLayout());
		naviPanel.setPreferredSize(new Dimension(200,100));
		
		folderPanel.setBackground(new Color(154,192,205));
		functionPanel.setBackground(new Color(188,210,238));
		functionPanel.setPreferredSize(new Dimension(200,50));
		folderPanel.setPreferredSize(new Dimension(200,100));
		folderPanel.setLayout(new GridLayout(1,1));
		
		//FolderPanel
		mainNode = new DefaultMutableTreeNode("MAIL");
		tree = new JTree(mainNode);
		tree.addTreeSelectionListener(treeNodeListener);
		tree.setBackground(new Color(154,192,205));
		folderPanel.add(tree);
		paintTree();						
		
		//FunctionPanel
		functionPanel.setLayout(new GridLayout(1,4));
		JButton[] button = new JButton[buttonText.length];
		
		for(int j=0;j<button.length;j++) {
			button[j] = new JButton(buttonText[j]);
			button[j].addActionListener(listen);
			button[j].setName(buttonText[j]);
			functionPanel.add(button[j]);
		}
		//Adding Panels
		naviPanel.add("Center",folderPanel);
		naviPanel.add("South",functionPanel);
	}
	
	public void paintTree() {
		if(folders!=null) {
			DefaultMutableTreeNode[] aNode = new DefaultMutableTreeNode[folders.length];
			for(int i=0;i<aNode.length;i++) {
				aNode[i] = new DefaultMutableTreeNode(folders[i]);
				mainNode.add(aNode[i]);
			}
		}
	}
	public void updateFolders() {
		RequestThread threadOne = new RequestThread(this) {
			@Override
			public void run() {
				folders = request.getFolders();
				MainPanel xPanel = this.getMainPanel();
				treeNodeListener.setFolder(folders);
				xPanel.paintTree();
				xPanel.revalidate();
				xPanel.repaint();
			}
		};
		threadOne.start();
	}
	public void updateTable(String[][] newData) {
		this.data=newData;
		this.centerPanel.removeAll();
		this.setCenterPanel();
		this.revalidate();
		this.repaint();		
	}
	
	public int getSelectedTableRow() {
		return table.getSelectedRow();
	}
}

Ja aber der "toogle" entsteht doch aber, das ich nach dem aufrufen des Fensters den boolean umkehre?! und beim nächsten Klick müsste er wenn er anfangs positiv war negativ sein.
 
Zuletzt bearbeitet:

Volvagia

Top Contributor
Hm. Du fügst im Konstruktor des MainPanels das CenterPanel hinzu, beim Drücken der Taste speicherst du es zwischen und beim nochmaligen Drücken fügst du es noch mal hinzu? Zudem tust du soweit ich sehe nichts, um das vorherige Panel wieder anzuzeigen, was du ja willst. Tut mir leid, aber ich stehe wohl nicht alleine da, wenn ich sage, dass ich keinen Plan habe was du da machen wolltest.

Java:
if(button.getName().equals("Read Mail")) {
	if(readMode) {
		readMode=false;
		MailViewer viewer = new MailViewer();
		temp = panel.centerPanel; //CenterPanel zwischenspeichern.
		panel.centerPanel.removeAll();
		panel.centerPanel.add(viewer); //Viewer auf das Centerpanel hinzufügen
		panel.centerPanel.revalidate();
		panel.centerPanel.repaint();
	} else {
		readMode=true;
		if(temp!=null) {
			panel.add("Center",temp); //Panel nochmal hinzufügen.
			panel.centerPanel.revalidate();
			panel.centerPanel.repaint();
		}
	}
}

???:L
 

mavinatic

Bekanntes Mitglied
Hey, du hast recht...ich habe das nun mal umgeformt, der Toogle effekt kommt nun zur geltung :p aber das CenterPanel ist entweder viewer oder leer?! ich speicher das doch im temp panel?! Bleiben die Komponenten darauf nicht erhalten?

Java:
if(button.getName().equals("Read Mail")) {
			if(readMode) {
				
				readMode=false;
				MailViewer viewer = new MailViewer();
				temp = panel.centerPanel;
				System.out.println(readMode + " Temp: " + temp);
				panel.centerPanel.removeAll();
				panel.centerPanel.add(viewer);
				panel.centerPanel.revalidate();
				panel.centerPanel.repaint();
			} else {
				System.out.println(readMode + " Temp: " + temp);
				readMode=true;
				if(temp!=null) {
					panel.centerPanel.removeAll();
					panel.add("Center",temp);
					panel.centerPanel.revalidate();
					panel.centerPanel.repaint();
				}
			}
 
Zuletzt bearbeitet:

Volvagia

Top Contributor
Ja, aber wenn du x = y schreibst, ist das Objekt trotzdem das Selbe, da beide Variablen auf das selbe Panel verweißen. (Bei primitiven Datentypen wie int wird glaub ich kopiert, aber so genau weiß ich das nicht.)

Das heißt, du fügst das CenterPanel 2 mal hinzu, auch wenn du die Variable temp benutzt, da es ja das selbe Panel bleibt.

Schau dir mal das an: #1660707 - Pastie
Das tauscht ein JPanel beim Klick auf ein JPanel, das als Button fungiert aus. Hab ich vor ein paar Tagen mit Unterstützung aus dem IRC geschrieben.
 

Volvagia

Top Contributor
So gehts mir bei fremden Source auch immer. Das Problem ist glaub ich, dass du denkst, dass "temp = panel.centerPanel;" das JPanel kopiert.

Sowas würde gehen:

Java:
if(button.getName().equals("Read Mail")) {
            if(readMode) {
                
                readMode=false;
                MailViewer viewer = new MailViewer();

                panel.centerPanel.removeAll();
                panel.centerPanel.add(viewer);
                panel.centerPanel.revalidate();
                panel.centerPanel.repaint();
            } else {
                System.out.println(readMode + " Temp: " + temp);
                readMode=true;
                if(temp!=null) {
                    OtherPanel op = new OtherPanel();                

                    panel.centerPanel.removeAll();
                    panel.add(op);
                    panel.centerPanel.revalidate();
                    panel.centerPanel.repaint();
                }
            }

Damit wird beim ersten Klick der MailViewer und beim zweiten irgend ein anderes Panel hinzugefügt. Du solltest aber überlegen, ob es wirklich notwendig ist, die Panels jedes mal neu zu erzeugen.
 

Michael...

Top Contributor
Um Komponenten zur Laufzeit auszutauschen könnte man auch ein CardLayout verwenden.

Unabhängig davon kann man Referenzen auf Objekte in Instanzvariablen speichern, somit kann man diese Objekte immer wieder verwenden und muss sie nicht dauernd neu erzeugen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Wie kann ich hier eine While schleife einbauen? Java Basics - Anfänger-Themen 3
B Email Client in der eigenen Software einbauen Java Basics - Anfänger-Themen 3
R Grafische Benutzeroberfläche GUI nachträglich einbauen Java Basics - Anfänger-Themen 3
J Erste Schritte Wie kann ich einen String in eine If einbauen :)? Java Basics - Anfänger-Themen 12
T setter im Konstruktor einbauen? Java Basics - Anfänger-Themen 8
T JScrollPane in den Code einbauen Java Basics - Anfänger-Themen 5
A HILFE in Java Matrizzen einbauen mit *Bezahlung!* Java Basics - Anfänger-Themen 1
H Eigenen Listener einbauen Java Basics - Anfänger-Themen 5
C Methoden Einen Timer einbauen, aber wie? Java Basics - Anfänger-Themen 5
F Verzögerung einbauen Java Basics - Anfänger-Themen 2
J Ranking für Spiel einbauen Java Basics - Anfänger-Themen 12
C "sortieren", wo einbauen? Java Basics - Anfänger-Themen 6
D Klassen Funktion in Klasse einbauen Java Basics - Anfänger-Themen 5
S Ziel in Spiel einbauen Java Basics - Anfänger-Themen 4
S Einbauen von Klassen Java Basics - Anfänger-Themen 2
D currentTimeMillis() in Sortierverfahren einbauen Java Basics - Anfänger-Themen 12
N javax.swing.JOptionPane einbauen? Java Basics - Anfänger-Themen 9
S Key-Listener richtig "einbauen" Java Basics - Anfänger-Themen 42
M Verstehe Aufgabe nicht, wie kann man schleifen einbauen? Java Basics - Anfänger-Themen 5
S Array in Aufgabe einbauen Java Basics - Anfänger-Themen 12
I If abfrage in switch case einbauen Java Basics - Anfänger-Themen 5
G Java zu Javascripts umwandeln oder in HTML einbauen Java Basics - Anfänger-Themen 14
P ant in java einbauen Java Basics - Anfänger-Themen 9
M previous und next einbauen Java Basics - Anfänger-Themen 53
D Projekt als jar exportieren: Wie externe jars einbauen? Java Basics - Anfänger-Themen 5
G StringUtils von jakarta.apache.org/commons/lang/api einbauen Java Basics - Anfänger-Themen 3
M Kurze Pause ins Programm einbauen Java Basics - Anfänger-Themen 5
G wie 'tabs' und 'zeilenumbruch' in textfile einbauen? Java Basics - Anfänger-Themen 5
M Schleifenindex in Variablennamen einbauen Java Basics - Anfänger-Themen 9
G MouseListener einbauen - wie? Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben