0

我正在制作一个简单的 java swing 程序,但我的组件的大小和位置有问题。我有三个 Jlabels 和三个 JtextFields。jlabels 是重叠的,所以只有我添加的最后一个显示。文本字段显示得非常小。(几乎看起来像行。)此外,所有内容都出现在一行上,我希望每个组件都在自己的行上。

代码:

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class setCustoms {
static JPanel panel = new JPanel();
static JFrame frame2 = new JFrame("Settings");

public static void makeWindow(){
    frame2.setVisible(true);
    frame2.add(panel);
    frame2.setBounds(500, 300, 500, 200);

    JLabel app1l = new JLabel("");
    JLabel app2l = new JLabel("");
    JLabel app3l = new JLabel("");
    JLabel site1l = new JLabel("");
    JLabel site2l = new JLabel("");
    JLabel site3l = new JLabel("");

    panel.add(app1l);
    app1l.setText("Set  Application ONE name and path");
    JTextField app1t = new JTextField();
    app1t.setBounds(100, 100, 100, 25);
    app1t.addActionListener(new Action());
    panel.add(app1t);

    panel.add(app2l);
    app1l.setText("Set  Application TWO name and path");
    JTextField app2t = new JTextField();
    app2t.addActionListener(new Action());
    panel.add(app2t);


    panel.add(app3l);
    app1l.setText("Set  Application THREE name and path");
    JTextField app3t = new JTextField();
    app3t.addActionListener(new Action());
    panel.add(app3t);

}
static class Action implements ActionListener{
    public void actionPerformed (ActionEvent e){


    }
}

}

编辑:虽然我确实有代码为某些项目设置界限,但它不起作用

4

3 回答 3

0

默认情况下JPanel使用 a FlowLayout,这会将每个组件排成一行。

setBounds没有效果,因为面板由布局管理器控制,它自己决定如何最好地放置和调整组件的大小

尝试使用不同的布局管理器。

查看在容器中布局组件以获取更多详细信息和想法

于 2013-11-09T00:13:12.677 回答
0

您需要使用 LayoutManager(布局管理器的可视化指南)来组织您的组件。

使用 GridLayout 的示例:

1) 在你的 JFrame 中配置 GridLayout

// with 3 rows and 2 columns
static JPanel panel = new JPanel(new GridLayout(3, 2));

2) 按从左到右到下的顺序创建和添加元素

JLabel app1l = new JLabel("");
app1l.setText("Set  Application ONE name and path");
panel.add(app1l);

JTextField app1t = new JTextField();
panel.add(app1t);

// (...)
//keep adding your elements in order

3) 打包你的 JFrame 来组织所有添加的元素

frame3.pack(); 
于 2013-11-09T00:32:43.327 回答
0
  • 一切都出现在一行上,我希望每个组件都在自己的行上。

正如 MadProgrammer 指出的那样,元素出现在一行中,因为您没有为panel. 按照 Pedro Vítor 的建议,您可以使用网格布局。例如,对于单列布局,您可以执行以下操作:

static JPanel panel = new JPanel (new GridLayout (0,1));

其中0表示没有行,1是列数。

  • jlabels 重叠

仔细查看您的代码。实际发生的情况是您一直在设置文本app1l。其他标签在那里。只是他们没有文字。可能是复制粘贴的产物;)

  • 关于实践的说明

正如 Pedro Vítor 所说,你应该养成按顺序添加元素的习惯。当您返回代码时,它将为您省去头疼的问题。此外,我建议您仅在添加所有组件后才使框架可见。否则,不能保证所有这些组件都会被渲染。看看这个问题:为什么我不应该在添加组件之前调用 setVisible(true)?

因此,考虑到所有因素,您的代码应如下所示:

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class setCustoms {
static JPanel panel = new JPanel(new GridLayout(0,1));
static JFrame frame2 = new JFrame("Settings");

public static void main (String[] args){
    JLabel app1l = new JLabel("");
    JLabel app2l = new JLabel("");
    JLabel app3l = new JLabel("");

    app1l.setText("Set  Application ONE name and path");
    panel.add(app1l);
    JTextField app1t = new JTextField();
    app1t.setBounds(100, 100, 100, 25);
    app1t.addActionListener(new Action());
    panel.add(app1t);

    app2l.setText("Set  Application TWO name and path");
    panel.add(app2l);
    JTextField app2t = new JTextField();
    app2t.addActionListener(new Action());
    panel.add(app2t);

    app3l.setText("Set  Application THREE name and path");
    panel.add(app3l);
    JTextField app3t = new JTextField();
    app3t.addActionListener(new Action());
    panel.add(app3t);

    frame2.add(panel);
    frame2.setBounds(500, 300, 500, 200);
    frame2.setVisible(true);   
}

static class Action implements ActionListener{
    public void actionPerformed (ActionEvent e){


    }
}

}

希望有帮助。

于 2013-11-09T01:15:51.790 回答