2016-07-31 12 views
1

ich einige Java-Code zu schreiben, dass der Benutzer einen Rahmen mit JLabel, JTextField und JButton sehen können.Java Flow

Ich möchte die JLabel namens "Count" und ich habe ein Problem mit FlowLayout. Ich möchte die Schnittstelle wie folgt aussehen:

enter image description here

Stattdessen habe ich dies:

enter image description here

Dies ist mein Code:

package modul1_Interfate_Grafice; 

import java.awt.BorderLayout; 
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.*; 

public class Exercitiu04 implements ActionListener { 
private JFrame frame; 
private JLabel labelCount; 
private JTextField tfCount; 
private JButton buttonCount; 
private int count = 0; 

    public void go() { 
     frame = new JFrame("Java Counter"); 
     labelCount = new JLabel("Counter"); 
     labelCount.setLayout(new FlowLayout()); 
     frame.getContentPane().add(BorderLayout.CENTER, labelCount); 

     tfCount = new JTextField(count + " ", 10); 
     tfCount.setEditable(false); 
     labelCount.add(tfCount); 

     buttonCount = new JButton("Count"); 
     labelCount.add(buttonCount); 
     buttonCount.addActionListener(this); 

     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(350, 150); 
     frame.setLocation(400, 200); 
    } 

    @Override 
    public void actionPerformed(ActionEvent event) { 
     count++; 
     tfCount.setText(count + ""); 
    } 

    public static void main(String[] args) { 
     Exercitiu04 a = new Exercitiu04(); 
     a.go(); 
    } 
} 
+2

'frame.setSize (350, 150);' sollte stattdessen sein 'frame.pack();' .. –

+2

'frame.setLocation (400, 200)' sollte sei 'frame.setLocationByPlatform (true)' wie von [dieser Frage und Antwort] angegeben (http://stackoverflow.com/questions/7143287/how-to-best-position-swing-guis). Es sollte auch vor 'frame.setVisible (true) 'stehen. – MasterBlaster

+2

Sie sollten Swing-Methoden immer in den Event-Dispatch-Thread einfügen. Werfen Sie einen Blick auf [Parallelität in Swing - Die Java ™ Tutorials] (https://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html). – MasterBlaster

Antwort

0

es lösen.

Statt labelCount.setLayout(new FlowLayout()); `i

gehabt haben sollte
frame.setLayout(new FlowLayout()); 
+0

Das Ändern dieser Zeile alleine löst das obige Problem nicht. Bist du sicher, dass du nichts anderes geändert hast? – MasterBlaster

+0

Ja, das war die einzige Änderung. –

+0

Das ist komisch. Wenn ich das Programm ausführe, sehe ich nur das JLabel auf dem JFrame. – MasterBlaster

0

Von Beschreibung JLabel Klasse,

JLabel ist:

Eine Anzeigefläche für eine kurze Textzeichenfolge oder ein Bild , oder beides.

Aber hier: labelCount.add(tfCount) und hier labelCount.add(buttonCount) Sie versuchen, ein Textfeld und eine Schaltfläche in ein Etikett zu setzen. In diesem Fall werden die Positionen von Button und Textfeld von FlowLayout gesteuert, die Position des Textes in der Beschriftung jedoch nicht.

Statt dessen sollten Sie alle Ihre Elemente gemeinsam JPanel, so:

... 
    frame = new JFrame("Java Counter"); 
    frame.setLayout(new BorderLayout()); 

    JPanel wrapper = new JPanel(); // JPanel has FlowLayout by default 

    labelCount = new JLabel("Counter"); 
    labelCount.setLayout(new FlowLayout()); 
    wrapper.add(labelCount); 

    tfCount = new JTextField(count + " ", 10); 
    tfCount.setEditable(false); 
    wrapper.add(tfCount); 

    buttonCount = new JButton("Count"); 
    buttonCount.addActionListener(this); 
    wrapper.add(buttonCount); 

    frame.add(BorderLayout.CENTER, wrapper); 
    ... 

Und wie MasterBlaster sagte, sollten Sie Swing Methoden in EDT setzen.

-3

Sie sollten setSize nicht verwenden, wenn Sie mit FlowLayout arbeiten. Verwenden Sie stattdessen pack(). Es macht das Fenster gerade groß genug, um alle in Ihrer Komponenten zu passen, die Dinge ordentlich sollte für Sie

+0

Das ist der erste Kommentar zu der Frage. Es ist auch nicht die Antwort auf das OP-Problem. – user1803551

0

Es gibt nur zwei Dinge, die Sie über FlowLayout wissen sollten:.

a) Es ist ein Standard-Layout-Manager die JPanel Komponente b) Es ist gut für nichts.

Dieses triviale Layout kann mit FlowLayout nicht erreicht werden. Wenn Sie Layouts in Swing erstellen, sollten Sie sich mit einigen leistungsstarken Layout-Managern vertraut machen: . Ich empfehle MigLayout und GroupLayout.

package com.zetcode; 

import javax.swing.JButton; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 
import net.miginfocom.swing.MigLayout; 

/* 
Simple UI with a MigLayout manager. 
Author Jan Bodnar 
Website zetcode.com 
*/ 

public class MigLayoutCounterEx extends JFrame { 

    public MigLayoutCounterEx() { 

     initUI(); 
    } 

    private void initUI() { 

     JLabel lbl = new JLabel("Counter"); 
     JTextField field = new JTextField(10); 
     JButton btn = new JButton("Count"); 

     createLayout(lbl, field, btn); 

     setTitle("Java Counter"); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    private void createLayout(JComponent... arg) { 

     setLayout(new MigLayout()); 

     add(arg[0]); 
     add(arg[1]); 
     add(arg[2]); 

     pack(); 
    }  

    public static void main(String[] args) { 

     SwingUtilities.invokeLater(() -> { 
      MigLayoutCounterEx ex = new MigLayoutCounterEx(); 
      ex.setVisible(true); 
     });   
    } 
} 

Das Beispiel ist trivial. Sie setzen einfach die drei Komponenten in die Zellen.

Screenshot:

enter image description here