NetBeanJavaGUI
我是JFrame的新手,我对NetBean中的布局有问题,如何解决这个布局问题?我试图调整大小,但元素的位置将变得混乱。我试图将每个细节显示到指定的文本区域。 我是否使用了错误的布局或我的编码有问题?帮助…> 我是否使用了错误的布局或我的编码有问题 嗯,是的,有一点,但它更多地与您的NetBeanJavaGUI,java,swing,user-interface,Java,Swing,User Interface,我是JFrame的新手,我对NetBean中的布局有问题,如何解决这个布局问题?我试图调整大小,但元素的位置将变得混乱。我试图将每个细节显示到指定的文本区域。 我是否使用了错误的布局或我的编码有问题?帮助…> 我是否使用了错误的布局或我的编码有问题 嗯,是的,有一点,但它更多地与您的JFrame的大小有关,不要对它们调用setSize(),而是调用pack()。但是,如果将其更改为pack(),则FlowLayout的默认方向为FlowLayout.HORIZONTAL,因此所有组件都将位于彼此
JFrame
的大小有关,不要对它们调用setSize()
,而是调用pack()
。但是,如果将其更改为pack()
,则FlowLayout
的默认方向为FlowLayout.HORIZONTAL
,因此所有组件都将位于彼此的右侧
然后,您有两个选项:
JFrame
的布局为FlowLayout
,但制作两个JPanel
s,一个用于图像,一个用于数据,图像可能也有默认的FlowLayout
,但另一个可能有GridLayout
GridBagLayout
,使图像JLabel
的高度为7个单元格,所有其他单元格的高度为1GridBagLayout
选项,建议您尝试使用multipanel选项(选项1)
但是,在开始之前,我必须提到代码中的其他问题:
- 您没有遵循:
,firstWordLowerCaseVariable
,firstWordLowerCaseMethods()
,FirstWordUpperCaseClasses
所有大写常量,这将使您和我们的代码更易于阅读和理解
- 您没有更改
的行为,因此无需从中继承:有关更多信息,请参阅JFrame
- 与上述观点相关,明智的做法是朝着
s而不是JPanel
s构建GUI,请参见:同样,我认为您将来可能会遇到类似的问题JFrame
- 您没有将您的程序放在上,请参见此以了解如何解决此问题
- 您正在调用
method,正如我前面所说的,最好是调用setSize(…)
method,将GUI大小的计算留给布局管理器pack()
- 在将所有组件添加到GUI之前,您正在调用
,这可能会导致出现空白或黑屏,这应该是程序中的最后一行setVisible
- 与上述观点相关,我总是喜欢从内到外开始做GUI,并以这种方式添加项目,而不是从外到内
- 为什么要使用
s而不是JTextArea
s作为用户信息JTextField
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class PokemonJournal {
private JFrame frame;
private JPanel pane;
private GridBagConstraints gbc;
private JLabel imageLabel;
private JLabel firstName;
private JLabel lastName;
private JLabel level;
private JLabel gender;
private JLabel pokemonCaught;
private JLabel raidWon;
private JLabel pokestopVisited;
private JTextField nameField;
private JTextField lastNameField;
private JTextField levelField;
private JTextField genderField;
private JButton pokemonCaughtButton;
private JButton raidWonButton;
private JButton pokestopVisitedButton;
public static void main(String[] args) {
SwingUtilities.invokeLater(new PokemonJournal()::createAndShowGui);
}
private void createAndShowGui() {
frame = new JFrame(getClass().getSimpleName());
pane = new JPanel();
pane.setLayout(new GridBagLayout());
gbc = new GridBagConstraints();
imageLabel = new JLabel();
try {
imageLabel.setIcon(new ImageIcon(
new URL("http://pm1.narvii.com/6535/1b362404d09091a335ce53fa68506827418890a3_128.jpg")));
} catch (MalformedURLException e) {
e.printStackTrace();
}
firstName = new JLabel("First Name: ");
lastName = new JLabel("Last Name: ");
level = new JLabel("Level: ");
gender = new JLabel("Gender: ");
pokemonCaught = new JLabel("Pokemon Caught: ");
raidWon = new JLabel("Raid Won: ");
pokestopVisited = new JLabel("Pokestop Visited: ");
nameField = new JTextField(10);
lastNameField = new JTextField(10);
levelField = new JTextField(10);
genderField = new JTextField(10);
pokemonCaughtButton = new JButton("Show");
raidWonButton = new JButton("Show");
pokestopVisitedButton = new JButton("Show");
gbc.gridx = 0;
gbc.gridy = 0;
gbc.gridheight = 7;
gbc.fill = GridBagConstraints.BOTH;
gbc.insets = new Insets(5, 5, 5, 5);
pane.add(imageLabel, gbc);
gbc.gridx = 1;
gbc.gridheight = 1;
pane.add(firstName, gbc);
gbc.gridx = 2;
pane.add(nameField, gbc);
gbc.gridx = 1;
gbc.gridheight = 1;
gbc.gridy++;
pane.add(lastName, gbc);
gbc.gridx = 2;
pane.add(lastNameField, gbc);
gbc.gridx = 1;
gbc.gridheight = 1;
gbc.gridy++;
pane.add(level, gbc);
gbc.gridx = 2;
pane.add(levelField, gbc);
gbc.gridx = 1;
gbc.gridheight = 1;
gbc.gridy++;
pane.add(gender, gbc);
gbc.gridx = 2;
pane.add(genderField, gbc);
gbc.gridx = 1;
gbc.gridheight = 1;
gbc.gridy++;
pane.add(pokemonCaught, gbc);
gbc.gridx = 2;
pane.add(pokemonCaughtButton, gbc);
gbc.gridx = 1;
gbc.gridheight = 1;
gbc.gridy++;
pane.add(raidWon, gbc);
gbc.gridx = 2;
pane.add(raidWonButton, gbc);
gbc.gridx = 1;
gbc.gridheight = 1;
gbc.gridy++;
pane.add(pokestopVisited, gbc);
gbc.gridx = 2;
pane.add(pokestopVisitedButton, gbc);
frame.add(pane);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
它生成了一个与此类似的GUI:
我是否使用了错误的布局或我的编码有问题
嗯,是的,有一点,但它更多地与您的JFrame
的大小有关,不要对它们调用setSize()
,而是调用pack()
。但是,如果将其更改为pack()
,则FlowLayout
的默认方向为FlowLayout.HORIZONTAL
,因此所有组件都将位于彼此的右侧
然后,您有两个选项:
JFrame
的布局为FlowLayout
,但制作两个JPanel
s,一个用于图像,一个用于数据,图像可能也有默认的FlowLayout
,但另一个可能有GridLayout
GridBagLayout
,使图像JLabel
的高度为7个单元格,所有其他单元格的高度为1GridBagLayout
选项,建议您尝试使用multipanel选项(选项1)
但是,在开始之前,我必须提到代码中的其他问题:
- 您没有遵循:
,firstWordLowerCaseVariable
,firstWordLowerCaseMethods()
,FirstWordUpperCaseClasses
所有大写常量,这将使您和我们的代码更易于阅读和理解
- 您没有更改
的行为,因此无需从中继承:有关更多信息,请参阅JFrame
- 与上述观点相关,明智的做法是朝着
s而不是JPanel
s构建GUI,请参见:同样,我认为您将来可能会遇到类似的问题JFrame
- 您没有将您的程序放在上,请参见此以了解如何解决此问题
- 您正在调用
method,正如我前面所说的,最好是调用setSize(…)
method,将GUI大小的计算留给布局管理器pack()
- 在将所有组件添加到GUI之前,您正在调用
,这可能会导致出现空白或黑屏,这应该是程序中的最后一行setVisible
- 与上述观点相关,我总是喜欢从内到外开始做GUI,并以这种方式添加项目,而不是从外到内
- 为什么要使用
s而不是JTextArea
s作为用户信息JTextField
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class PokemonJournal {
private JFrame frame;
private JPanel pane;
private GridBagConstraints gbc;
private JLabel imageLabel;
private JLabel firstName;
private JLabel lastName;
private JLabel level;
private JLabel gender;
private JLabel pokemonCaught;
private JLabel raidWon;
private JLabel pokestopVisited;
private JTextField nameField;
private JTextField lastNameField;
private JTextField levelField;
private JTextField genderField;
private JButton pokemonCaughtButton;
private JButton raidWonButton;
private JButton pokestopVisitedButton;
public static void main(String[] args) {
SwingUtilities.invokeLater(new PokemonJournal()::createAndShowGui);
}
private void createAndShowGui() {
frame = new JFrame(getClass().getSimpleName());
pane = new JPanel();
pane.setLayout(new GridBagLayout());
gbc = new GridBagConstraints();
imageLabel = new JLabel();
try {
imageLabel.setIcon(new ImageIcon(
new URL("http://pm1.narvii.com/6535/1b362404d09091a335ce53fa68506827418890a3_128.jpg")));
} catch (MalformedURLException e) {
e.printStackTrace();
}
firstName = new JLabel("First Name: ");
lastName = new JLabel("Last Name: ");
level = new JLabel("Level: ");
gender = new JLabel("Gender: ");
pokemonCaught = new JLabel("Pokemon Caught: ");
raidWon = new JLabel("Raid Won: ");
pokestopVisited = new JLabel("Pokestop Visited: ");
nameField = new JTextField(10);
lastNameField = new JTextField(10);
levelField = new JTextField(10);
genderField = new JTextField(10);
pokemonCaughtButton = new JButton("Show");
raidWonButton = new JButton("Show");
pokestopVisitedButton = new JButton("Show");
gbc.gridx = 0;
gbc.gridy = 0;
gbc.gridheight = 7;
gbc.fill = GridBagConstraints.BOTH;
gbc.insets = new Insets(5, 5, 5, 5);
pane.add(imageLabel, gbc);
gbc.gridx = 1;
gbc.gridheight = 1;
pane.add(firstName, gbc);
gbc.gridx = 2;
pane.add(nameField, gbc);
gbc.gridx = 1;
gbc.gridheight = 1;
gbc.gridy++;
pane.add(lastName, gbc);
gbc.gridx = 2;
pane.add(lastNameField, gbc);
gbc.gridx = 1;
gbc.gridheight = 1;
gbc.gridy++;
pane.add(level, gbc);
gbc.gridx = 2;
pane.add(levelField, gbc);
gbc.gridx = 1;
gbc.gridheight = 1;
gbc.gridy++;
pane.add(gender, gbc);
gbc.gridx = 2;
pane.add(genderField, gbc);
gbc.gridx = 1;
gbc.gridheight = 1;
gbc.gridy++;
pane.add(pokemonCaught, gbc);
gbc.gridx = 2;
pane.add(pokemonCaughtButton, gbc);
gbc.gridx = 1;
gbc.gridheight = 1;
gbc.gridy++;
pane.add(raidWon, gbc);
gbc.gridx = 2;
pane.add(raidWonButton, gbc);
gbc.gridx = 1;
gbc.gridheight = 1;
gbc.gridy++;
pane.add(pokestopVisited, gbc);
gbc.gridx = 2;
pane.add(pokestopVisitedButton, gbc);
frame.add(pane);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
它生成了一个与此类似的GUI:
在预期的布局上,您显示了两个图像,左侧是否应该有两个图像?或者1?1,预期的输出只是一个例子好吧,那么让我试试