NetBeanJavaGUI

NetBeanJavaGUI,java,swing,user-interface,Java,Swing,User Interface,我是JFrame的新手,我对NetBean中的布局有问题,如何解决这个布局问题?我试图调整大小,但元素的位置将变得混乱。我试图将每个细节显示到指定的文本区域。 我是否使用了错误的布局或我的编码有问题?帮助…> 我是否使用了错误的布局或我的编码有问题 嗯,是的,有一点,但它更多地与您的JFrame的大小有关,不要对它们调用setSize(),而是调用pack()。但是,如果将其更改为pack(),则FlowLayout的默认方向为FlowLayout.HORIZONTAL,因此所有组件都将位于彼此

我是JFrame的新手,我对NetBean中的布局有问题,如何解决这个布局问题?我试图调整大小,但元素的位置将变得混乱。我试图将每个细节显示到指定的文本区域。 我是否使用了错误的布局或我的编码有问题?帮助…> 我是否使用了错误的布局或我的编码有问题

嗯,是的,有一点,但它更多地与您的
JFrame
的大小有关,不要对它们调用
setSize()
,而是调用
pack()
。但是,如果将其更改为
pack()
,则
FlowLayout
的默认方向为
FlowLayout.HORIZONTAL
,因此所有组件都将位于彼此的右侧

然后,您有两个选项:

  • 保持
    JFrame
    的布局为
    FlowLayout
    ,但制作两个
    JPanel
    s,一个用于图像,一个用于数据,图像可能也有默认的
    FlowLayout
    ,但另一个可能有
    GridLayout

  • 对所有组件使用
    GridBagLayout
    ,使图像
    JLabel
    的高度为7个单元格,所有其他单元格的高度为1

  • 对于下面的示例,我将使用
    GridBagLayout
    选项,建议您尝试使用multipanel选项(选项1)

    但是,在开始之前,我必须提到代码中的其他问题:

    • 您没有遵循:
      firstWordLowerCaseVariable
      firstWordLowerCaseMethods()
      FirstWordUpperCaseClasses
      所有大写常量,这将使您和我们的代码更易于阅读和理解

    • 您没有更改
      JFrame
      的行为,因此无需从中继承:有关更多信息,请参阅

    • 与上述观点相关,明智的做法是朝着
      JPanel
      s而不是
      JFrame
      s构建GUI,请参见:同样,我认为您将来可能会遇到类似的问题

    • 您没有将您的程序放在上,请参见此以了解如何解决此问题

    • 您正在调用
      setSize(…)
      method,正如我前面所说的,最好是调用
      pack()
      method,将GUI大小的计算留给布局管理器

    • 在将所有组件添加到GUI之前,您正在调用
      setVisible
      ,这可能会导致出现空白或黑屏,这应该是程序中的最后一行

    • 与上述观点相关,我总是喜欢从内到外开始做GUI,并以这种方式添加项目,而不是从外到内

    • 为什么要使用
      JTextArea
      s而不是
      JTextField
      s作为用户信息

    现在,使用我给您的第二个选项,遵循上述建议的代码如下:

    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个单元格,所有其他单元格的高度为1

  • 对于下面的示例,我将使用
    GridBagLayout
    选项,建议您尝试使用multipanel选项(选项1)

    但是,在开始之前,我必须提到代码中的其他问题:

    • 您没有遵循:
      firstWordLowerCaseVariable
      firstWordLowerCaseMethods()
      FirstWordUpperCaseClasses
      所有大写常量,这将使您和我们的代码更易于阅读和理解

    • 您没有更改
      JFrame
      的行为,因此无需从中继承:有关更多信息,请参阅

    • 与上述观点相关,明智的做法是朝着
      JPanel
      s而不是
      JFrame
      s构建GUI,请参见:同样,我认为您将来可能会遇到类似的问题

    • 您没有将您的程序放在上,请参见此以了解如何解决此问题

    • 您正在调用
      setSize(…)
      method,正如我前面所说的,最好是调用
      pack()
      method,将GUI大小的计算留给布局管理器

    • 在将所有组件添加到GUI之前,您正在调用
      setVisible
      ,这可能会导致出现空白或黑屏,这应该是程序中的最后一行

    • 与上述观点相关,我总是喜欢从内到外开始做GUI,并以这种方式添加项目,而不是从外到内

    • 为什么要使用
      JTextArea
      s而不是
      JTextField
      s作为用户信息

    现在,使用我给您的第二个选项,遵循上述建议的代码如下:

    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,预期的输出只是一个例子好吧,那么让我试试