2016-07-31 62 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