2016-07-31 66 views
1

我在寫一些Java代碼,允許用戶看到一個框架,其中JLabelJTextFieldJButtonJava FlowLayout

我想JLabel被稱爲「計數」,我有一個問題FlowLayout。 我想要的界面看起來像這樣:

enter image description here

相反,我有這樣的:

enter image description here

這是我的代碼:

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);'應改爲'frame.pack();'.. –

+2

'frame.setLocation(400,200)'應是'frame.setLocationByPlatform(true)'如[這個問題和答案]所述(http://stackoverflow.com/questions/7143287/how-to-best-position-swing-guis)。它也應該在'frame.setVisible(true)'之前。 – MasterBlaster

+2

你應該總是把擺動方法放在事件派發線程中。看看[併發中的Swing - Java™教程](https://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html)。 – MasterBlaster

回答

0

解決它。

代替labelCount.setLayout(new FlowLayout());`我應該有

frame.setLayout(new FlowLayout()); 
+0

單獨更改此行並不能解決上述問題。你確定你沒有改變別的嗎? – MasterBlaster

+0

是的,這是唯一的變化。 –

+0

這很奇怪。當我運行程序時,我所看到的只是JFrame上的JLabel。 – MasterBlaster

0

JLabel類的描述中,

JLabel是:

用於短文本字符串或圖像的顯示區域, 或兩者。

但是這裏:labelCount.add(tfCount)和這裏labelCount.add(buttonCount)你試圖把一個文本框和一個按鈕放到標籤中。在這種情況下,按鈕和文本字段的位置由FlowLayout控制,但文本在標籤中的位置不是。

相反的,你應該把所有的元素共同JPanel,像這樣:

... 
    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); 
    ... 

而且,像MasterBlaster說,你應該把揮杆方法EDT。

-3

處理FlowLayout時不應該使用setSize。改用pack()。它使窗口只是足夠大,以適應所有的組件應該收拾東西你

+0

這是對這個問題的第一個評論。這也不是OP問題的答案。 – user1803551

0

只有兩件事情你應該知道FlowLayout

一)這是一個默認的佈局管理器JPanel組件 b)它毫無用處。

FlowLayout無法實現這種平凡的佈局。 在Swing中進行佈局時,應該讓自己熟悉 以及一些強大的佈局管理器。我推薦MigLayoutGroupLayout

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); 
     });   
    } 
} 

這個例子很簡單。您只需將這三個組件放入 單元中即可。

截圖:

enter image description here