【问题标题】:Java FlowLayoutJava 流布局
【发布时间】:2016-07-31 15:45:33
【问题描述】:

我正在编写一些 Java 代码,允许用户查看带有 JLabelJTextFieldJButton 的框架。

我希望将JLabel 称为“计数”,但FlowLayout 有问题。 我希望界面看起来像这样:

相反,我有这个:

这是我的代码:

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

【问题讨论】:

标签: java swing layout-manager flowlayout


【解决方案1】:

解决它。

而不是labelCount.setLayout(new FlowLayout());`我应该有

frame.setLayout(new FlowLayout());

【讨论】:

  • 单独更改这一行并不能为我解决上述问题。你确定你没有改变其他任何东西吗?
  • 是的,这是唯一的变化。
  • 这很奇怪。当我运行程序时,我看到的只是 JFrame 上的 JLabel。
  • 你确定没有评论这段代码frame.getContentPane().add(BorderLayout.CENTER, labelCount);并添加了以下frame.add(labelCount);
【解决方案2】:

来自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,你只需要知道两件事:

    a) 它是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);
            });        
        }
    }
    

    这个例子很简单。您只需将三个组件放入 细胞。

    截图:

    【讨论】:

      【解决方案4】:

      在处理 FlowLayout 时不应该使用 setSize。而是使用 pack()。它使窗口大到足以容纳所有组件。这应该会为您整理好东西

      【讨论】:

      • 这是对该问题的第一条评论。这也不是 OP 问题的答案。
      猜你喜欢
      • 2010-10-21
      • 2012-04-08
      • 2012-10-02
      • 2017-11-23
      • 2010-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-30
      相关资源
      最近更新 更多