Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按钮未显示在正确的位置_Java_Swing_Button_Layout_Layout Manager - Fatal编程技术网

Java 按钮未显示在正确的位置

Java 按钮未显示在正确的位置,java,swing,button,layout,layout-manager,Java,Swing,Button,Layout,Layout Manager,如何使按钮显示在文本区域下方的行上 //Imports import java.awt.CardLayout; import java.awt.Color; import java.awt.Component; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BorderFactory; import javax.

如何使按钮显示在文本区域下方的行上

//Imports
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextPane;

public class ProfessorPhysInstall {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        //Variables
        final JFrame mainframe = new JFrame();
        mainframe.setSize(500, 435);
        final JPanel cards = new JPanel(new CardLayout());
        final CardLayout cl = (CardLayout)(cards.getLayout());
        mainframe.setTitle("Future Retro Gaming Launcher");
        //Screen1
        JPanel screen1 = new JPanel();
        JTextPane TextPaneScreen1 = new JTextPane();
        TextPaneScreen1.setEditable(false);
        TextPaneScreen1.setBackground(new java.awt.Color(240, 240, 240));
        TextPaneScreen1.setText("Welcome to the install wizard  for Professor Phys!\n\nPlease agree to the following terms and click the next button to continue.");
        TextPaneScreen1.setSize(358, 48);
        TextPaneScreen1.setLocation(0, 0);
        TextPaneScreen1.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.black),BorderFactory.createEmptyBorder(5, 5, 5, 5)));
        TextPaneScreen1.setMargin(new Insets(4,4,4,4));
        screen1.add(TextPaneScreen1);
        JTextArea TextAreaScreen1 = new JTextArea();
        JScrollPane sbrText = new JScrollPane(TextAreaScreen1);
        TextAreaScreen1.setRows(15);
        TextAreaScreen1.setColumns(40);
        TextAreaScreen1.setEditable(false);
        TextAreaScreen1.setText("Lots of text");
        TextAreaScreen1.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.black),BorderFactory.createEmptyBorder(5, 5, 5, 5)));
        TextAreaScreen1.setMargin(new Insets(4,4,4,4));
        screen1.add(sbrText);
        final JCheckBox Acceptance = new JCheckBox();
        Acceptance.setText("I Accept The EULA Agreenment.");
        screen1.add(Acceptance);
        final JButton NextScreen1 = new JButton();
        NextScreen1.setText("Next");
        NextScreen1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                if(Acceptance.isSelected())
                    cl.next(cards);
            }
        });      
        screen1.add(NextScreen1);        
        JButton CancelScreen1 = new JButton();
        CancelScreen1.setText("Cancel");
        CancelScreen1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                System.exit(0);
            }
        });      
        screen1.add(CancelScreen1);
        cards.add(screen1);

        //Screen2
        JPanel screen2 = new JPanel();
        JTextPane TextPaneScreen2 = new JTextPane();
        TextPaneScreen2.setEditable(false);
        TextPaneScreen2.setBackground(new java.awt.Color(240, 240, 240));
        TextPaneScreen2.setText("Please select the Future Retro Gaming Launcher.");
        TextPaneScreen2.setSize(358, 48);
        TextPaneScreen2.setLocation(0, 0);
        TextPaneScreen2.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.black),BorderFactory.createEmptyBorder(5, 5, 5, 5)));
        TextPaneScreen2.setMargin(new Insets(4,4,4,4));
        screen2.add(TextPaneScreen2);
        final JButton BackScreen2 = new JButton();
        BackScreen2.setText("Back");
        BackScreen2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                if(Acceptance.isSelected())
                    cl.previous(cards);
            }
        });    
        screen2.add(BackScreen2);     
        final JButton NextScreen2 = new JButton();
        NextScreen2.setText("Next");
        NextScreen2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                if(Acceptance.isSelected())
                    cl.next(cards);
            }
        });      
        screen2.add(NextScreen2);        
        JButton CancelScreen2 = new JButton();
        CancelScreen2.setText("Cancel");
        CancelScreen2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                System.exit(0);
            }
        });      
        screen2.add(CancelScreen2);
        cards.add(screen2);

        mainframe.add(cards);
        mainframe.setVisible(true);
    }
}
这就是它看起来的样子

使用合适的

您已将所有组件添加到
screen2
中,默认情况下,该屏幕具有
FlowLayout
。有很多不同的方法来实现你的目标


更多阅读:

JPanel的默认布局管理器是。顾名思义,它只是一个接一个地传递组件

您将需要尝试一个不同的布局管理器,类似的东西将做您想要的,但它是一个复杂的布局。您最好尝试使用复合布局来实现相同的效果

也就是说,将UI分解为小块,并为每个组应用不同的布局管理器

退房

你也会从阅读中受益

Ps


你可能还想考虑把每个屏幕都分解成它自己的类,它所代表的代码很难阅读和理解——IMHO/

通常的方法是结合所需的外观布局。例如

import java.awt.*;
import javax.swing.*;

public class ProfessorPhysInstall {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        //Variables
        final JFrame mainframe = new JFrame();
        mainframe.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        mainframe.setSize(500, 435);
        final JPanel cards = new JPanel(new BorderLayout());
        mainframe.setTitle("Future Retro Gaming Launcher");

        //Screen2
        JPanel screen2 = new JPanel();
        JTextPane TextPaneScreen2 = new JTextPane();
        TextPaneScreen2.setText("Please select the Future Retro Gaming Launcher.");
        // set the preferred size, rather than the size!
        //TextPaneScreen2.setSize(358, 48);
        TextPaneScreen2.setPreferredSize(new Dimension(358, 48));
        TextPaneScreen2.setBorder(
            BorderFactory.createCompoundBorder(
                BorderFactory.createLineBorder(Color.black),
                BorderFactory.createEmptyBorder(5, 5, 5, 5)));
        TextPaneScreen2.setMargin(new Insets(4,4,4,4));
        screen2.add(TextPaneScreen2);

        JPanel buttons = new JPanel(new FlowLayout(FlowLayout.CENTER, 5,5));
        final JButton BackScreen2 = new JButton();
        BackScreen2.setText("Back");
        buttons.add(BackScreen2);
        final JButton NextScreen2 = new JButton("Next");
        buttons.add(NextScreen2);

        JButton CancelScreen2 = new JButton("Cancel");
        buttons.add(CancelScreen2);

        cards.add(screen2, BorderLayout.PAGE_START);
        cards.add(buttons, BorderLayout.PAGE_END);

        mainframe.add(cards);
        mainframe.pack();
        mainframe.setVisible(true);
    }
}

提示
  • 请学习类、方法和属性名称的通用(特别是用于名称的大小写),并一致使用它们
  • 为了更快地获得更好的帮助,请发布一个
  • 不要设置顶级容器的大小。而是布局内容&调用
    pack()
  • 有关如何组合布局以创建所需布局的想法,请参见


  • 另外,请注意关于其他两个答案的建议

  • 不要在这里以外的任何地方发布你的代码,并解释你自己试图解决的问题。这不是调试服务。如果出现意外情况,我们可以提供帮助。但如果只是为了找到你错过的一件非常具体的事情,那么它不太可能帮助其他人,因此不适合这个网站。好吧,很抱歉。代码非常长,所以我认为它更容易阅读。基本上我不知道该怎么办。第一屏(第1屏)一切都很完美。但现在我“我得到的按钮不是他们自己的线路。我试着增加一个边距,但我认为这与空间被填满有关。似乎如果没有足够的空间来放置按钮,它会转到下一行。+1表示到达first@MadProgrammer:哈哈。这对我来说确实是一个罕见的壮举。而且它不会弄乱卡片的布局?还有,你有没有建议的布局?就我个人而言,我会制作一个GridBag lickey split,但对于初学者来说,这不是最容易使用的。或者使用BorderLayout,您可以将文本区域放在北部或中部(我不确定您到底在追求什么),并将另一个包含按钮的面板放在南部。+1表示迫切需要的代码约定链接。+1表示只制作代码的开头和结尾:P@MadProgrammer我认为这是一个值得的挑战,因为我早上还没有喝到咖啡因