kryptisches Verhalten bei GridLayout

pkm

Bekanntes Mitglied
Ich habe mal eine Frage, welche wie eine Anfängerfrage erscheinen mag, aber ich komme nicht weiter...

ich habe vor, einen interaktiven Taschenrechner zu programmieren, welchen ich eventuell zum Julfest jemandem schenken kann. Ich wollte dazu ein Gridlayout benutzen, und zunächst einmal die Knöpfe derart anordnen, dass pro Zeile 4 Zahlenknöpfe nebeneinander stehen, was ich (siehe Code) mit einem GridLayout erreichen wollte: GridLayout experimentLayout = new GridLayout(4,4); Dennoch sind pro Zeile 3 Knöpfe nebeneinander zu sehen, ich habe aber keine Ahnung, weshalb.

Code:
package core;

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

public class Main extends JFrame {
  
    int gap, sizer;//Gap zwischen den Tasten, sizer - wie gross soll das Ding werden.
  
    public Main(String name) {
      
       super(name);
      
        gap = 10;
        sizer = 7;
      
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      
       setResizable(false);
    }
  

  
    public void addComponentsToPane(final Container pane) {
      
       final JPanel compsToCalculate = new JPanel();
       final JPanel controls = new JPanel();
    
       GridLayout experimentLayout = new GridLayout(4,4);//???
     
           experimentLayout.setHgap(gap);
           experimentLayout.setVgap(gap);
      
      compsToCalculate.setLayout(experimentLayout);
      
       ButtonFactory bFactory = new ButtonFactory();

         compsToCalculate.setPreferredSize(new Dimension((int)(((Component) bFactory.getButton(Button.NUMBER)).getWidth() * 2.5) + gap * sizer,
                (int)(((Component) bFactory.getButton(Button.NUMBER)).getHeight() * 3.5)+gap * sizer));

//compsToCalculate hat bereits sein Layout.... nun sind es aber gemäss Girdlayout 4 Spalten.
//Dennoch sieht das Ergebnis aus wie im verlinkten Bild - also quasi mit 3 Spalten - wie kann das sein?
    
        for(int i=7;i<10;i++){
           JButton num = (JButton) bFactory.getButton(Button.NUMBER);
           num.setText(new Integer(i).toString());
           compsToCalculate.add(num);
        }
      
    
        for(int i=4;i<7;i++){
           JButton num = (JButton) bFactory.getButton(Button.NUMBER);
           num.setText(new Integer(i).toString());
           compsToCalculate.add(num);
        }
      
        for(int i=1;i<4;i++){
           JButton num = (JButton) bFactory.getButton(Button.NUMBER);
           num.setText(new Integer(i).toString());
           compsToCalculate.add(num);
        }
            
        JButton applyButton = (JButton) bFactory.getButton(Button.RESULT);
      
           controls.setLayout(new GridLayout(1,1)); 
           controls.setPreferredSize(new Dimension((int)(applyButton.getWidth()),
                    (int)(applyButton.getHeight())));
           controls.add(applyButton);
      
        pane.add(compsToCalculate, BorderLayout.NORTH);
        pane.add(new JPanel(), BorderLayout.CENTER);
        pane.add(controls, BorderLayout.SOUTH);
    }
  
    
    private static void createAndShowGUI() {
      
       Main frame = new Main("");
      
       frame.addComponentsToPane(frame.getContentPane());
      
       frame.pack();
      
       frame.setVisible(true);
    }
  
    public static void main(String[] args) {
      
        try {
          
        UIManager.setLookAndFeel("om.sun.java.swing.plaf.motif.MotifLookAndFeel");
        } catch (UnsupportedLookAndFeelException ex) {
            ex.printStackTrace();
        } catch (IllegalAccessException ex) {
            ex.printStackTrace();
        } catch (InstantiationException ex) {
            ex.printStackTrace();
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        }
      
        UIManager.put("swing.boldMetal", Boolean.FALSE);
      
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}


Darum wollte ich einmal fragen - weiß jemand, woran das liegen könnte?
 

Anhänge

  • calculator.png
    calculator.png
    4,4 KB · Aufrufe: 33

HarleyDavidson

Bekanntes Mitglied
Ich habe das mal nachgestellt und tatsächlich ...
GridLayout scheint die Componenten selbstständig aufzuteilen, damit alle Zeilen möglichst gefüllt sind.
Wenn du beispielsweise noch einen weiteren Button hinzufügst, hast du tatsächlich vier Buttons in einer Reihe und drei Zeilen.

Wobei ich auch nicht ganz verstehe, warum du vier Spalten haben möchtest. Du platzierst 3 x 3 Buttons in das JPanel, da ist diese Aufteilung doch eigentlich schlauer oder?

Wäre ein GridBagLayout eine Alternative? Damit hast du wesentlich mehr Freiheiten und Einstellungsmöglichkeiten und kannst ganz genau definieren, in welcher Zelle der Button platziert werden soll.
 

pkm

Bekanntes Mitglied
Vielen Dank für den Tipp - ich glaube des Rätsels Lösung ist die, dass Gridlayout einfach in der Hinsicht echt buggy ist, dass der Konstruktor nicht so funktioniert, wie er funktionieren soll. Ich habe es nun wie folgt gelöst:

Code:
       GridLayout experimentLayout = new GridLayout();
      
           experimentLayout.setHgap(gap);
           experimentLayout.setVgap(gap);
      
           experimentLayout.setColumns(4);
           experimentLayout.setRows(4);

Mein nächster Streich sollte werden, dass ich dem frame einen KeyListener wie folgt hinzufüge, sodass eine statische Methode setResult() aufgerufen wird, wenn der User "ENTER" drückt:

Code:
private static void createAndShowGUI() {
      
       Main frame = new Main("Calculator");
      
       frame.addKeyListener(new KeyListener(){

           @Override
           public void keyTyped(KeyEvent e) {
               // TODO Auto-generated method stub
              
           }

           @Override
           public void keyPressed(KeyEvent e) {
              
              if(e.getKeyCode() == KeyEvent.VK_ENTER){
                
                 setResult();//Der soll imr nur "huhu" oder sowas drucken, geht aber nicht.
                
              }
              
           }

           @Override
           public void keyReleased(KeyEvent e) {
               // TODO Auto-generated method stub
              
           }
          
       });
      
       frame.addComponentsToPane(frame.getContentPane());
      
       frame.pack();
      
       frame.setVisible(true);
    }
  
    public static void main(String[] args) {
      
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }

}

Die Methode soll mir nur "huhu" oder sowas drucken, geht aber nicht. Ich verstehe nicht, wieso das der Fall ist, denn der Frame ist doch diejenige Componente, an welche der KeyListener hingehört .. mit frame.getContentPane() habe ich es auch schon versucht, aber immer, wenn ich enter drücke, wird die Methode setResult() offenbar nicht aufgerufen.

Anbei das ganze Ding als .zip
 

Anhänge

  • Calculator.zip
    17,9 KB · Aufrufe: 0

HarleyDavidson

Bekanntes Mitglied
Die Frage ist, was genau passieren soll, wenn der User Enter drückt.
Ich nehme schwer an, dass das Ergebnis ausgerechnet werden soll.
Der KeyListener gehört also nicht ans Frame, sondern an das Textfeld.
Dann sollte das klappen.
Wenn du einen globalen KeyListener haben möchtest, der Tasten abfängt, egal welche Komponente
in deinem Frame gerade den Fokus hat, empfehle ich dir den KeyEventDispatcher anzupassen.
Wie das geht habe ich schon auf meiner Seite mal in einem Artikel beschrieben:
http://itwerkstatt.omdriebigs-gspann.de/keyeventdispatcher-globale-tastatureingaben-abfangen
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Juelin Komisches Verhalten des JavaFXprogrammes AWT, Swing, JavaFX & SWT 4
Hatsi09 JavaFx Mediaplayer seltsames Verhalten AWT, Swing, JavaFX & SWT 0
T JavaFX JFrame verhalten wie JOptionPane (ErrorMessage) AWT, Swing, JavaFX & SWT 1
ralfb1105 Swing Frage zu SwingWorker Verhalten bei cancel() AWT, Swing, JavaFX & SWT 2
krgewb AWT JFrame soll sich wie Dialog verhalten AWT, Swing, JavaFX & SWT 9
D Merkwürdiges Verhalten vom JMenu AWT, Swing, JavaFX & SWT 4
T JavaFX Verhalten ImageView bei grossen BIlddateien AWT, Swing, JavaFX & SWT 0
HarleyDavidson Swing Seltsames Verhalten GridBagLayout AWT, Swing, JavaFX & SWT 11
P JFrame langsam / seltsames Verhalten AWT, Swing, JavaFX & SWT 6
R Ändern Default-Verhalten von JScrollpane in einer JScrollpane AWT, Swing, JavaFX & SWT 1
S JTabbedProblem - "komisches" Verhalten AWT, Swing, JavaFX & SWT 2
P Swing Seltsames ActionListener-Verhalten AWT, Swing, JavaFX & SWT 7
T Wie ist das "Lookup-Verhalten" von JList, JCombobox änderbar? AWT, Swing, JavaFX & SWT 4
D Seltsames Verhalten meiner CheckBoxen AWT, Swing, JavaFX & SWT 7
N Swing Dynamisches Verhalten bei Änderung Fenstergröße AWT, Swing, JavaFX & SWT 6
E Swing Fehlerhaftes Verhalten bei gleichzeitigen Verwendnen von PopUpMenu und JDialog?! AWT, Swing, JavaFX & SWT 5
Ollek JTextField Verhalten mit LayoutManager AWT, Swing, JavaFX & SWT 8
E Swing Maskformatter Verhalten?! AWT, Swing, JavaFX & SWT 5
A JTreeTable - unerklärliches Verhalten von getValueAt AWT, Swing, JavaFX & SWT 2
F Merkwürdiges Verhalten zeichnen sperater Thread AWT, Swing, JavaFX & SWT 13
M Komisches Verhalten: JCombobox mit KeyListener AWT, Swing, JavaFX & SWT 13
hdi SWT Shell: Auslagerung von Code verändert Verhalten AWT, Swing, JavaFX & SWT 6
U Verhalten des CheckBoxCellEditors AWT, Swing, JavaFX & SWT 3
H2SO3- AWT seltsammes verhalten eines Panels AWT, Swing, JavaFX & SWT 9
pinerski Swing JList merkwürdiges Verhalten beim sortieren AWT, Swing, JavaFX & SWT 3
I Hyper-Link ähnliches Verhalten AWT, Swing, JavaFX & SWT 5
L JFrame-Verhalten bei Klick auf Schließen-Kreuz ändern AWT, Swing, JavaFX & SWT 3
R JProgressBar-Verhalten AWT, Swing, JavaFX & SWT 5
dzim [SWT] Seltsames verhalten bei TableViewer mit TextCellEditor AWT, Swing, JavaFX & SWT 5
G Seltsames Verhalten JButton AWT, Swing, JavaFX & SWT 6
J JScrollBar scroll-Verhalten auf 2 JButtons umleiten? AWT, Swing, JavaFX & SWT 2
ARadauer bestimmtes verhalten für jtable AWT, Swing, JavaFX & SWT 6
M Merkwürdiges Verhalten von ListCellRender AWT, Swing, JavaFX & SWT 2
M Seltsames Verhalten Tooltip und JDialog AWT, Swing, JavaFX & SWT 8
S Wie verhalten sich transparente Grafiken? AWT, Swing, JavaFX & SWT 5
sparrow Tasten mit Umlauten im KeyListener verhalten sich seltsam AWT, Swing, JavaFX & SWT 4
S Seltsames verhalten des Befehles getContentPane().add(.) AWT, Swing, JavaFX & SWT 7
K JList - merkwürdiges Verhalten bei Leertaste (unter Focus) AWT, Swing, JavaFX & SWT 7
M drawImage mit seltsamen verhalten AWT, Swing, JavaFX & SWT 2
E GridLayout auf ScrollPane AWT, Swing, JavaFX & SWT 4
thor_norsk GridLayout AWT, Swing, JavaFX & SWT 11
H Swing , GridLayout, Größenbestimmung der Komponenten im Layout AWT, Swing, JavaFX & SWT 8
M Swing GridLayout AWT, Swing, JavaFX & SWT 2
D [Swing] Anordnung von Komponenten mit GridLayout Manager AWT, Swing, JavaFX & SWT 13
K Swing GridLayout - x und y bei Mausklick ausgeben AWT, Swing, JavaFX & SWT 4
S GridLayout SWT: Anordnung Composites nebeneinander AWT, Swing, JavaFX & SWT 2
B GridLayout - wie am besten implementieren AWT, Swing, JavaFX & SWT 3
B GridLayout Basics AWT, Swing, JavaFX & SWT 1
L Eigene JComponent in GridLayout AWT, Swing, JavaFX & SWT 9
fLooojava GridLayout - Frage bezüglich Kachelgröße AWT, Swing, JavaFX & SWT 5
F JPanel "verschmelzen" GridLayout AWT, Swing, JavaFX & SWT 10
M LayoutManager GridLayout funktioniert nicht AWT, Swing, JavaFX & SWT 0
T LayoutManager GridLayout panel.setSize funktioniert nicht AWT, Swing, JavaFX & SWT 1
F Gridlayout AWT, Swing, JavaFX & SWT 6
A JPanel oder GridLayout Größe festsetzten AWT, Swing, JavaFX & SWT 4
X GridLayout JPanel austauschen AWT, Swing, JavaFX & SWT 2
A JFrame Größenänderung mit Maus und GridLayout AWT, Swing, JavaFX & SWT 10
J Button in GridLayout AWT, Swing, JavaFX & SWT 2
C LayoutManager Grafik soll nicht im GridLayout Skalieren AWT, Swing, JavaFX & SWT 3
L LayoutManager GridLayout verschiebt sich AWT, Swing, JavaFX & SWT 6
B GridLayout AWT, Swing, JavaFX & SWT 6
T Spaltengröße einzelner Spalten in Gridlayout festlegen AWT, Swing, JavaFX & SWT 3
Karuka Abstände im GridLayout ändern AWT, Swing, JavaFX & SWT 8
Karuka 2D-Grafik Bilder in GridLayout einfügen AWT, Swing, JavaFX & SWT 7
C Scollpane an dynamisches GridLayout anpassen? AWT, Swing, JavaFX & SWT 3
J Swing Bilder anzeigen in Gridlayout AWT, Swing, JavaFX & SWT 11
C Linien über GridLayout zeichnen AWT, Swing, JavaFX & SWT 3
K Probleme mit Gridlayout AWT, Swing, JavaFX & SWT 4
U Elemente im Panel zentrieren mit GridLayout AWT, Swing, JavaFX & SWT 3
Z Swing JButton erweitern/Gridlayout AWT, Swing, JavaFX & SWT 2
L Swing GridLayout AWT, Swing, JavaFX & SWT 4
lumo LayoutManager SWT GridLayout - Reihenfolge ändern AWT, Swing, JavaFX & SWT 7
C Swing GridLayout: Kann man die Spaltenbreiten variabel gestalten? AWT, Swing, JavaFX & SWT 4
J SWT Größe eines Composite mit Gridlayout festlegen AWT, Swing, JavaFX & SWT 2
Y Kein GantChart in einem GridLayout AWT, Swing, JavaFX & SWT 5
M Formular in GridLayout ? AWT, Swing, JavaFX & SWT 17
R LayoutManager Problem mit GridLayout AWT, Swing, JavaFX & SWT 5
F LayoutManager GridLayout 0/0 auf andere Ecke setzen AWT, Swing, JavaFX & SWT 4
Rudolf Swing Gridlayout und Grouper vorhanden? AWT, Swing, JavaFX & SWT 4
S SWT GridLayout scrollbar machen? AWT, Swing, JavaFX & SWT 7
A Gridlayout Vertikal anordnen AWT, Swing, JavaFX & SWT 6
D LayoutManager GridLayout, 2 labels nebeneinander AWT, Swing, JavaFX & SWT 8
B Swing GridLayout.add über 2 Spalten? AWT, Swing, JavaFX & SWT 7
R LayoutManager GridLayout verändert isch andauernd AWT, Swing, JavaFX & SWT 4
A Frage zu GridLayout AWT, Swing, JavaFX & SWT 4
B GridLayout und scrollbar AWT, Swing, JavaFX & SWT 5
J Swing Bild in GridLayout AWT, Swing, JavaFX & SWT 8
aze GridLayout: Keine automatische Ausdehnung AWT, Swing, JavaFX & SWT 2
M SWT keine Scrollbar bei widgets.List und GridLayout AWT, Swing, JavaFX & SWT 2
M Image an Gridlayout anpassen AWT, Swing, JavaFX & SWT 5
E SWT Problem mit Gridlayout AWT, Swing, JavaFX & SWT 3
G SWT GridLayout AWT, Swing, JavaFX & SWT 2
lumo SWT GridLayout - clear? AWT, Swing, JavaFX & SWT 4
T GridLayout Zeilen Hintergrund AWT, Swing, JavaFX & SWT 5
N Gridlayout macht Probleme AWT, Swing, JavaFX & SWT 3
L GridLayout verändert festgesetzte Größe der Komponenten AWT, Swing, JavaFX & SWT 12
S Gridlayout - Tabellenzeile "beenden" AWT, Swing, JavaFX & SWT 3
Dragonfire GridLayout Probleme AWT, Swing, JavaFX & SWT 4
A JLabel, Icons und GridLayout AWT, Swing, JavaFX & SWT 3
C JPanel-Array in GridLayout AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben