Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

26.07.2014, 00:17

Java GUI unvollständig

Hallo liebe Community,

ich habe eine Frage bezüglich der Java GUI, denn wenn ich eine Java GUI erstelle werden die Componenten nicht vollständig angezeigt.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package de.SEO.gui;

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

import de.SEO.util.List;

public class start extends JFrame{
    
    public static List list = new List();

    public start (String title) {
        this.setTitle(title);
        this.setSize(500, 300);
        this.setResizable(false);

        this.setLayout(null);
        
        this.setVisible(true);
        
        JButton addButton = new JButton();
        
        addButton.setSize(50, 30);
        addButton.setText("+");
        addButton.setVisible(true);
        
        final JTextField wordAdd = new JTextField();
        
        wordAdd.setSize(100, 30);
        wordAdd.setLocation(100, 0);
        wordAdd.setVisible(true);
        
        addButton.addMouseListener(new MouseListener() {
            
            @Override
            public void mouseReleased(MouseEvent arg0) {}
            
            @Override
            public void mousePressed(MouseEvent arg0) {}
            
            @Override
            public void mouseExited(MouseEvent arg0) {}
            
            @Override
            public void mouseEntered(MouseEvent arg0) {
                String keyword = wordAdd.getText();
                list.keyword.add(keyword);
            }
            
            @Override
            public void mouseClicked(MouseEvent arg0) {}
        });
        
        this.add(addButton);
        this.add(wordAdd);
    }
    
    public static void main(String[] args) {
        start s = new start("Keyword Optimization");
    }

}


Das ist momentan der Stand.

Bei der Ausführung werden der JButton und das JTextField mal angezeigt und mal nicht.

Ich verwende Java 8 Update 5 unter Windows 7.

Woher kommt den der Fehler?

Mit freundlichen Grüßen,
Christian
LostLife ein 3D RPG - development

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ChrisIsOn« (26.07.2014, 00:32)


2

26.07.2014, 00:39

Ok. Hat sich erledigt. Nach einem Update zum Update 11 ist der Fehler weg.
LostLife ein 3D RPG - development

3

28.07.2014, 12:07

Da kannst du trotzdem noch einiges verbessern :thumbup:
  • Von JFrame zu erben bläht dir nur die Schnittstellen deiner Klasse auf, das kannst du dir fast immer sparen
  • Klassische Verwendung von JFrame: Erstellen, Konfigurieren (Close-Operation, Größe, Layout, ...), Komponenten hinzufügen, pack() und setVisible() auf dem Frame aufrufen
  • Wenn du das Frame auf visible setzt und anschließend Komponenten hinzufügst, musst du für einen sauberen Ablauf revalidate() und repaint() auf dem Frame aufrufen. Bei einem statischen Frame brauchst du das aber nicht, setz einfach den Aufruf ans Ende.
  • Null-Layout falls möglich vermeiden. Oft ist es einfacher, mehrere Layouts ineinander zu verschachteln.
  • Klassennamen in Java groß
  • Bessere Kapselung, public static für veränderbare Objekte riecht nach verbesserungswürdigem Design.
  • Statt MouseListener könntest du MouseAdapter verwenden, dort sind die leeren Methoden vorimplementiert.
Könnte grob umgebaut so aussehen (nicht alle Punkte drin):

Java-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class Start {

    public static List list = new List();

    public Start(String title) {
    JFrame frame = new JFrame(title);
    frame.setSize(500, 300);
    frame.setResizable(false);
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.setLayout(null);

    JButton addButton = new JButton();

    addButton.setSize(50, 30);
    addButton.setText("+");
    addButton.setVisible(true);

    final JTextField wordAdd = new JTextField();

    wordAdd.setSize(100, 30);
    wordAdd.setLocation(100, 0);
    wordAdd.setVisible(true);

    addButton.addMouseListener(new MouseAdapter() {

        @Override
        public void mouseEntered(MouseEvent e) {
        String keyword = wordAdd.getText();
        list.keyword.add(keyword);
        }

    });

    frame.add(addButton);
    frame.add(wordAdd);

    frame.setVisible(true);
    }

    public static void main(String[] args) {
    Start s = new Start("Keyword Optimization");
    }

}

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

4

28.07.2014, 14:40

Grundsätzlich kann ich den Verbesserungsvorschlägen zustimmen, nur sehe ich das in Bezug auf das Erben von JFrame anders. Wenn man in seiner Anwendung ein bestimmtes Fenster hat (mit einer bestimmten Anordnung von Elementen), dann lohnt es sich durchaus, dafür eine entsprechende Klasse zu verwenden. Gerade bei Dialogen, die häufiger verwendet werden, dürfte der Vorteil eher ersichtlich sein.
Und die richtige Methode beim späteren Hinzufügen von Elementen ist validate()

Ergänzend zum Null-Layout:
Ob es einfacher ist, passende Layoutmanager zu verwenden, kommt darauf an, was man erreichen will. Gehört aber bspw. eine Skalierbarkeit der Anwendung dazu (das sollte es auch), dann sollte man auf jeden Fall die richtigen LayoutManager wählen. Bei einem Null-Layout müsste man sich sonst selbst darum kümmern, dass bei Skalierungen die einzelnen Komponenten in ihren Positionen und Größen angepasst werden, wofür ja genau die LayoutManager da sind.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

5

28.07.2014, 15:30

@Bananenshake:

Danke. Schon verbessert ;).

@Sacaldur:

Ich stimme dir zu.
So hat man uns das damals (letztes Schuljahr ;)) beigebracht. Ich mach das auch gerne so - finde ich übersichticher wenn die UI so 'zusammen erstellt'.

MfG Chris.

PS: Ach ja das mit der List. Ich möchte static weitestgehend vermeiden.
LostLife ein 3D RPG - development

Werbeanzeige