GUI - Layout per Laufzeit erstellen/verändern?

Paul279

Aktives Mitglied
Guten Tag,

ich komme von der C++ Programmierung auf Java.

Ich habe eine Form mit einem Button. Kann ich zur Laufzeit das Interface mit Buttons, Labels, Listen etc. befüllen und auch Buttons nachträglich verschwinden lassen, oder brauche ich dafür eine neue Form?

Danke für das Verständnis dieser Anfänger-Frage

Mfg
Paul
 
G

Gast2

Gast
Nein, dafür brauchst du keine neue "Form".
Du kannst zur Laufzeit Komponenten per add/remove hinzufügen und entfernen. Danach ein validate() auf den Container aktualisiert den dann.
Eventuell ist für dich das CardLayout auch passender.

Aber als Anfänger würde ich nicht unbedingt direkt mit GUIs anfangen.
 

Paul279

Aktives Mitglied
Danke sehr.

Also wissen über Logik und Programmierung ist vorhanden. Leider nicht über GUIs die, ich jetzt aber angehe.

Vielleicht kannst du mir dann sagen was in meinem Code falsch ist:

Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package myserver;

import java.awt.BorderLayout;
import java.awt.Component;
import java.io.*;
import java.lang.reflect.InvocationTargetException;
import java.net.ServerSocket;
import java.util.Arrays;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFileChooser;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.filechooser.FileFilter;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;



/**
 *
 * @author PC-schlappi
 */
public class server extends javax.swing.JFrame {

    private JTable table;
    private Component btnAction;
    
    /**
     * Creates new form server
     */
    public server() {
        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.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jButton1.setText("Impocrt CSV");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jButton1)
                .addContainerGap(297, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jButton1)
                .addContainerGap(266, Short.MAX_VALUE))
        );

        jButton1.getAccessibleContext().setAccessibleName("JButton_ImportCSV");

        pack();
    }// </editor-fold>                        

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
        
        JFileChooser fc = new JFileChooser();
        fc.setDialogTitle("DateiAuswahl");
        fc.setFileFilter(new FileNameFilter());
        
        if (fc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
            final File file = fc.getSelectedFile();
            System.out.println(file.getName());
            
                SwingUtilities.invokeLater(new Runnable() 
                {
                        public void run() {
                            TableModel model = parseCSVAndCreateTableModel(file);
                            table.setModel(model);
                        }
                });
        }   
        
        table = new JTable();
        add(new JScrollPane(table), BorderLayout.CENTER);
        add(btnAction, BorderLayout.SOUTH);
 
        pack();
        setVisible(true);        
        
    }                                        

private TableModel parseCSVAndCreateTableModel(File file) {
 
        Vector v = new Vector();
        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader(file));
 
            // Überschriften stehen in erster Zeile
            String[] rowItems = br.readLine().split(",");
            Vector header = new Vector(Arrays.asList(rowItems));
            while (br.ready()) {
                rowItems = br.readLine().split(",");
                v.add(new Vector(Arrays.asList(rowItems)));
            }
            DefaultTableModel model = new DefaultTableModel(v, header);
            return model;
 
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
 
        return null;
    }    
    
   public class FileNameFilter extends FileFilter
   {

        @Override
      public boolean accept(File arg0)
      {
         if(arg0.isDirectory()) return true;
         if(arg0.getName().endsWith("csv")) return true;
         return false;
      }

        @Override
      public String getDescription()
      {
         return "Nur CSV";
      }
      
   }    
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) throws IOException {
        /*
         * Set the Nimbus look and feel
         */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /*
         * If Nimbus (introduced in Java SE 6) is not available, stay with the
         * default look and feel. For details see
         * [url=http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html]How to Set the Look and Feel (The Java™ Tutorials > Creating a GUI With JFC/Swing > Modifying the Look and Feel)[/url]
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(server.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(server.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(server.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(server.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /*
         * Create and display the form
         */
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new server().setVisible(true);
            }
        });
        
        /*
         * Socket aufbauen
         */
        ServerSocket serverSocket = null;
        boolean listening = true;

        try {
            serverSocket = new ServerSocket(4444);
        } catch (IOException e) {
            System.err.println("Could not listen on port: 4444.");
            System.exit(-1);
        }

        while (listening)
	    new serverThread(serverSocket.accept()).start();

        serverSocket.close();
        
    }
    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    // End of variables declaration                   
}

Der Fehler muss hier liegen (Zeile: 104 - 109):
Java:
        table = new JTable();
        add(new JScrollPane(table), BorderLayout.CENTER);
        add(btnAction, BorderLayout.SOUTH);
 
        pack();
        setVisible(true);


//EDIT
Habe jetzt die Codezeile in das geändert:
Java:
        table = new JTable();
        add(new JScrollPane(table), BorderLayout.CENTER);

        this.rootPane.validate();

Bekomme keinen Fehler mehr, aber die GUI ändert sich leider auch nicht. :-(

PS: Wenn man das Beispiel kompilieren möchte einfach das Socket weg nehmen.
 
Zuletzt bearbeitet:

jgh

Top Contributor
du bekommst keine NPE auf diese Codezeile????

[java=106]add(btnAction, BorderLayout.SOUTH);[/code]

imho sollte das eine NPE schmeißen..aber ok, ich habe jetzt mal ein JButton dafür genommen.

Grundsätzlich solltest du dir überlegen, ob du deine GUI programmieren, oder mit Netbeans oder anderen GUI-Buildern zusammenklicken willst.

hier mal ein hässlicher Code von mir...aber diesen Sch...GUI-Builder-Code ....macht es einen auch nicht einfach

Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.net.ServerSocket;
import java.util.Arrays;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.filechooser.FileFilter;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

/**
 * 
 * @author PC-schlappi
 */
public class server extends javax.swing.JFrame {

	private JPanel panel;
	private JTable table;
	private Component btnAction = new JButton("fasd");

	/**
	 * Creates new form server
	 */
	public server() {
		initComponents();
	}

	private void initComponents() {

		jButton1 = new javax.swing.JButton();

		setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

		jButton1.setText("Import CSV");
		jButton1.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				jButton1ActionPerformed(evt);
			}
		});

		panel = new JPanel();
		panel.add(jButton1);
		add(panel);
		setSize(400, 400);
		setLocationRelativeTo(null);

	}

	private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
		// TODO add your handling code here:

		JFileChooser fc = new JFileChooser();
		fc.setDialogTitle("DateiAuswahl");
		fc.setFileFilter(new FileNameFilter());

		if (fc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
			final File file = fc.getSelectedFile();
			System.out.println(file.getName());

			SwingUtilities.invokeLater(new Runnable() {
				public void run() {
					TableModel model = parseCSVAndCreateTableModel(file);
					table.setModel(model);
				}
			});
		}

		table = new JTable();
		table.setPreferredSize(new Dimension(500, 500));
		remove(panel);
		add(new JScrollPane(table));

		JPanel panel2 = new JPanel();
		panel2.add(btnAction);

		add(panel2, BorderLayout.SOUTH);
		validate();
		repaint();
		// pack();
		// setVisible(true);

	}

	private TableModel parseCSVAndCreateTableModel(File file) {

		Vector v = new Vector();
		BufferedReader br = null;
		try {
			br = new BufferedReader(new FileReader(file));

			// Überschriften stehen in erster Zeile
			String[] rowItems = br.readLine().split(",");
			Vector header = new Vector(Arrays.asList(rowItems));
			while (br.ready()) {
				rowItems = br.readLine().split(",");
				v.add(new Vector(Arrays.asList(rowItems)));
			}
			DefaultTableModel model = new DefaultTableModel(v, header);
			return model;

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				br.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		return null;
	}

	public class FileNameFilter extends FileFilter {

		@Override
		public boolean accept(File arg0) {
			if (arg0.isDirectory())
				return true;
			if (arg0.getName().endsWith("csv"))
				return true;
			return false;
		}

		@Override
		public String getDescription() {
			return "Nur CSV";
		}

	}

	/**
	 * @param args
	 *            the command line arguments
	 */
	public static void main(String args[]) throws IOException {
		/*
		 * Set the Nimbus look and feel
		 */
		// <editor-fold defaultstate="collapsed"
		// desc=" Look and feel setting code (optional) ">
		/*
		 * If Nimbus (introduced in Java SE 6) is not available, stay with the
		 * default look and feel. For details see
		 * [url=http://download.oracle.com
		 * /javase/tutorial/uiswing/lookandfeel/plaf.html]How to Set the Look
		 * and Feel (The Java™ Tutorials > Creating a GUI With JFC/Swing >
		 * Modifying the Look and Feel)[/url]
		 */
		try {
			for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager
					.getInstalledLookAndFeels()) {
				if ("Nimbus".equals(info.getName())) {
					javax.swing.UIManager.setLookAndFeel(info.getClassName());
					break;
				}
			}
		} catch (ClassNotFoundException ex) {
			java.util.logging.Logger.getLogger(server.class.getName()).log(
					java.util.logging.Level.SEVERE, null, ex);
		} catch (InstantiationException ex) {
			java.util.logging.Logger.getLogger(server.class.getName()).log(
					java.util.logging.Level.SEVERE, null, ex);
		} catch (IllegalAccessException ex) {
			java.util.logging.Logger.getLogger(server.class.getName()).log(
					java.util.logging.Level.SEVERE, null, ex);
		} catch (javax.swing.UnsupportedLookAndFeelException ex) {
			java.util.logging.Logger.getLogger(server.class.getName()).log(
					java.util.logging.Level.SEVERE, null, ex);
		}
		// </editor-fold>

		/*
		 * Create and display the form
		 */
		java.awt.EventQueue.invokeLater(new Runnable() {

			public void run() {
				new server().setVisible(true);
			}
		});

		/*
		 * Socket aufbauen
		 */
		ServerSocket serverSocket = null;
		boolean listening = true;

		try {
			serverSocket = new ServerSocket(4444);
		} catch (IOException e) {
			System.err.println("Could not listen on port: 4444.");
			System.exit(-1);
		}

		while (listening)
			// new serverThread(serverSocket.accept()).start();

			serverSocket.close();

	}

	// Variables declaration - do not modify
	private javax.swing.JButton jButton1;
	// End of variables declaration
}
 
F

Firephoenix

Gast
Irgendwann muss mir mal jemand erklären wo sich dieser grausame Stil eingebürgert hat von JFrame zu erben ohne eine einzige Methode zu überschreiben...
Bei JPanel mit paintComponent ist es ja noch verständlich, aber dieses "extends JFrame" sieht man irgendwie dauernd.

Wenn man die Klasse server von außen betrachtet könnte man sowas machen:
Java:
server s = ...;
s.getContentPane().add(new JButton());

sieht irgendwie komisch aus finde ich :)

Gruß
 

Paul279

Aktives Mitglied
Danke an "jgh" für deine Mühen.

Werde den Code morgen ausprobieren :)

Aber warum es mit this.rootPane.validate() nicht funktioniert würde mich trotzdem interessieren.
Vielleicht weiß ja jemand die Antwort.

@Firephoenix
Leider habe ich mit Java und GUI erst vor kurzem angefangen, also kann ich leider nichts dazu sagen.
Vielleicht weiß jemand anders mehr ;-)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
llabusch Interface Layout eines Labels während der Laufzeit ändern Java Basics - Anfänger-Themen 0
J Layout Manager, welcher ist der Richtige für mein Program? Java Basics - Anfänger-Themen 1
J neues Object (JLabel) vorab zum Layout hinzufügen , Location setzen, etc? Java Basics - Anfänger-Themen 2
S setContentView(R.Layout.XXX) wird Rot angezeigt Java Basics - Anfänger-Themen 0
C Erste Schritte Layout an Bildschirmauflösung anpassen Java Basics - Anfänger-Themen 9
N Project layout eclipse ( seperate ordner für klassen ? ) Java Basics - Anfänger-Themen 1
C Der Swing Layout-Manager hasst mich Java Basics - Anfänger-Themen 4
N Erste Schritte JOptionPane - zerstörtes Layout Java Basics - Anfänger-Themen 2
R Card Layout refresh nach Änderung Java Basics - Anfänger-Themen 1
P welche Komponente ist im Layout? Java Basics - Anfänger-Themen 2
F Welchen Layout Manager wählen? Java Basics - Anfänger-Themen 13
Q Layout Manager Java Basics - Anfänger-Themen 6
llabusch Layout neu zeichnen lassen Java Basics - Anfänger-Themen 2
T Layout Java Basics - Anfänger-Themen 9
L Anderes Layout für JOptionPane? Java Basics - Anfänger-Themen 6
N Datum abgleichen und Frage zum Layout Java Basics - Anfänger-Themen 3
S Layout mit JPanel in JScrollPanel funktioniert nicht Java Basics - Anfänger-Themen 3
M Text linksbündig im Box'ed Layout Java Basics - Anfänger-Themen 4
M Interface Das Null-Layout Java Basics - Anfänger-Themen 12
B Daten eingeben und ausgeben mit einem Layout Java Basics - Anfänger-Themen 17
L Erste Schritte Layout eines Java Programms Java Basics - Anfänger-Themen 5
P Layout Manager - Welches Layout für Memory? Java Basics - Anfänger-Themen 7
F welches Layout für JButton-Liste verwenden Java Basics - Anfänger-Themen 6
JAVAnnik layout erstellen Java Basics - Anfänger-Themen 24
R Welcher Layout Manager-für so ein Fenster? Java Basics - Anfänger-Themen 5
J Unterschiedliche Spaltengröße im Grid(bag)layout Java Basics - Anfänger-Themen 6
M Layout einfach bilden Java Basics - Anfänger-Themen 4
F Card Layout Java Basics - Anfänger-Themen 8
S JButton trotz Box-Layout skalieren Java Basics - Anfänger-Themen 6
L Layout Frage Java Basics - Anfänger-Themen 2
N GUI-Layout-Problem&Anordnung Java Basics - Anfänger-Themen 14
M Frage zu GUI-Layout Java Basics - Anfänger-Themen 4
N Welches Layout soll ich verwenden? Java Basics - Anfänger-Themen 3
W Unterschied JFrame und JLabel bezüglich Layout? Java Basics - Anfänger-Themen 2
N Layout Probleme Java Basics - Anfänger-Themen 2
J Layout bei Swing Java Basics - Anfänger-Themen 4
W Grid Layout wird falsch dargestellt Java Basics - Anfänger-Themen 4
S Layout JDialog Java Basics - Anfänger-Themen 9
T Border Layout alle mittleren felder gleich groß Java Basics - Anfänger-Themen 3
D Der richtige Layout Manager Java Basics - Anfänger-Themen 8
T Eine doofe Frage zum null-Layout-Manager Java Basics - Anfänger-Themen 6
M Layout Probleme Java Basics - Anfänger-Themen 10
T Layout Problem Java Basics - Anfänger-Themen 2
B Frage zum Layout Java Basics - Anfänger-Themen 6
M zufällige auswahl eines Panels aus Grid Layout Java Basics - Anfänger-Themen 3
K Layout Java Basics - Anfänger-Themen 6
J Layout Java Basics - Anfänger-Themen 8
B package org.jdesktop.layout does not exist Java Basics - Anfänger-Themen 8
A center in einer border layout Java Basics - Anfänger-Themen 8
E Layout für Prozentaufteilung Java Basics - Anfänger-Themen 3
kulturfenster Tic Tac Toe Layout-Sorgen Java Basics - Anfänger-Themen 25
A Problem mit BorderLayout und null-Layout Java Basics - Anfänger-Themen 5
N Bildbeispiel von Layout: wie nutze ich das GBLayout dafür? Java Basics - Anfänger-Themen 17
mwildam JToolBar und Group-Layout (NetBeans) dockt nicht richtig an Java Basics - Anfänger-Themen 3
Q Classe durch Buttonklick im Layout öffnen Java Basics - Anfänger-Themen 4
A frames layout Java Basics - Anfänger-Themen 4
G Bilder im Grid-Bag-Layout Java Basics - Anfänger-Themen 2
H Layout wird nicht eingehalten . Java Basics - Anfänger-Themen 3
G Welcher Layout-Manager? *confused* Java Basics - Anfänger-Themen 2
D Layout beim Applet Java Basics - Anfänger-Themen 6
G Layout Java Basics - Anfänger-Themen 3
G Layout Java Basics - Anfänger-Themen 9
U Welches Layout? Java Basics - Anfänger-Themen 6
I Layout anpassen Java Basics - Anfänger-Themen 4
L Layout Problem Java Basics - Anfänger-Themen 2
J Tabelle erneuert bei Card Layout nicht Java Basics - Anfänger-Themen 2
S Layout Probleme (Kein Adden möglich) Java Basics - Anfänger-Themen 18
M ScrollPane Flow Layout Java Basics - Anfänger-Themen 4
P Null Layout Java Basics - Anfänger-Themen 17
R JPanel und Layout Java Basics - Anfänger-Themen 4
Bierhumpen Swing und Layout Java Basics - Anfänger-Themen 18
M JButton im JLabel Layout Java Basics - Anfänger-Themen 12
Z JButton vs Layout Java Basics - Anfänger-Themen 8
E Scrollbar mit NULL- Layout? Java Basics - Anfänger-Themen 4
L Swing - Layout-Problem Java Basics - Anfänger-Themen 12
B Null-Layout oder GridLayout usw. Java Basics - Anfänger-Themen 5
L Layout Java Basics - Anfänger-Themen 5
DEvent anfängerfrage: wieso layout erst beim verändern? Java Basics - Anfänger-Themen 6
Detlef Bosau Nachladen von Klassen zur Laufzeit Java Basics - Anfänger-Themen 24
E Alter (Laufzeit) berechnen Java Basics - Anfänger-Themen 11
W Array zur Laufzeit bearbeiten? Java Basics - Anfänger-Themen 31
D Objekterzeugungen mit zur Laufzeit variierenden Attributen Java Basics - Anfänger-Themen 7
J GroupLayout zur Laufzeit erweitern Java Basics - Anfänger-Themen 1
B Übersetzungszeit und Laufzeit Java Basics - Anfänger-Themen 3
amgadalghabra Die vier Sortieralgorithmen die durchschnittliche Laufzeit in Millisekunden Java Basics - Anfänger-Themen 37
U Dijkstra Algorithmus Laufzeit Java Basics - Anfänger-Themen 3
S Laufzeit Quicksort wenn alle Elemente gleich sind Java Basics - Anfänger-Themen 4
L Anzahl der Elemente key in einem Array mit log(N) Laufzeit Java Basics - Anfänger-Themen 4
S Interpreter-Fehler Endlosschleife zur Laufzeit aber warum? Java Basics - Anfänger-Themen 15
J JavaFX Label,Button zur Laufzeit Java Basics - Anfänger-Themen 30
H Laufzeit Java Basics - Anfänger-Themen 11
C Laufzeit eines Sortier-Algorithmus ermitteln Java Basics - Anfänger-Themen 4
L Objekt Typ zur Laufzeit ermitteln Java Basics - Anfänger-Themen 1
J Datei im Package zur Laufzeit editieren Java Basics - Anfänger-Themen 1
M Quicksort Laufzeit langsam Java Basics - Anfänger-Themen 5
M Quicksort Laufzeit langsam Java Basics - Anfänger-Themen 0
R Objekte zur Laufzeit in Schleife erzeugen und in ArrayList ablegen Java Basics - Anfänger-Themen 4
C Laufzeit von Stack Operation Java Basics - Anfänger-Themen 5
D Laufzeit von einfachem Programm Java Basics - Anfänger-Themen 21
J Laufzeit berechnen/Laufzeitanalyse Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben