我正在制作一个简单的java swing程序,但我的组件大小和位置都有问题。我有三个Jlabels和三个JtextFields。 jlabels重叠,所以只显示我添加的最后一个。文本字段显示得非常小。(几乎看起来像线条。)此外,所有内容都显示在一行上,我希望每个组件都在自己的行上。
CODE:
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){
}
}
}
编辑:althoguh我确实有代码来设置某些项目的边界,它不起作用
答案 0 :(得分:0)
默认情况下,JPanel
使用FlowLayout
,这会将每个组件放在一行旁边。
setBounds
没有效果,因为面板受布局管理器的控制,布局管理器自己决定如何最好地放置和调整组件
尝试使用其他布局管理器。
请查看Laying out components within a container了解更多详情和想法
答案 1 :(得分: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();
答案 2 :(得分:0)
正如MadProgrammer指出的那样,元素出现在一行中,因为您没有为panel
设置布局管理器。根据PedroVítor的建议,您可以使用grid layout。例如,对于单列布局,您可以执行以下操作:
static JPanel panel = new JPanel (new GridLayout (0,1));
其中0
表示没有行,1
表示列数。
仔细查看您的代码。实际发生的是,您始终只为app1l
设置文本。其他标签就在那里。只是他们没有文字。可能是复制和粘贴的产物;)
正如PedroVítor所说,你应养成按顺序添加元素的习惯。当你回到代码时,它会让你头疼。此外,我建议您仅在添加所有组件后才能看到框架。否则,无法保证将呈现所有这些组件。看看这个问题:Why shouldn't I call setVisible(true) before adding components?
因此,考虑到所有因素,您的代码应如下所示:
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){
}
}
}
希望有所帮助。