【问题标题】:How can set location and size for card layout?如何设置卡片布局的位置和大小?
【发布时间】:2016-07-25 20:30:33
【问题描述】:

我一直在开发这个小型琐事游戏,作为一个让我忙碌的项目,但我不知道如何让它看起来不错。最好,按钮将位于顶部,问题将朝向底部并设置窗口大小。尽管 setSize() 或 setPreferredSize() 不起作用。所以窗口很薄,按钮和问题都在顶部。

package mainPackage;

import javax.swing.JFrame;

public class MainGame{
    public static void main(String[] args) {
        new WindowComp();

    }
}

    package mainPackage;

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

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class WindowComp extends JComponent implements ActionListener {

    JFrame frame = new JFrame("trivia game");




    static JButton [] buttons;
    static JLabel question;
    JPanel panelCont = new JPanel();
    JPanel panelStartScreen= new JPanel();
    JPanel panelGame = new JPanel();
    JButton startGame = new JButton("Start Trivia");
    CardLayout cl = new CardLayout();




    public WindowComp(){
        question = new JLabel("default");
        buttons = new JButton[4];
        panelCont.setLayout(cl);



        buttons[0] = new JButton("Answer 1 : " + "default");
        buttons[1] = new JButton("Answer 2 : " + "default");
        buttons[2] = new JButton("Answer 3 : " + "default");
        buttons[3] = new JButton("Answer 4 : " + "default");

        buttons[0].addActionListener(this);
        buttons[1].addActionListener(this);
        buttons[2].addActionListener(this);
        buttons[3].addActionListener(this);
        startGame.addActionListener(this);
        addAll();
        panelCont.add(panelStartScreen, "1");
        panelCont.add(panelGame, "2");



        frame.add(panelCont);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setSize(300, 300);
        frame.pack();
        frame.setVisible(true);



    }


    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == buttons[0]){
            setQuestion("button 1");
            setAnswers( "start", "start", "start", "start");
        }
        if(e.getSource() == buttons[1]){
            setQuestion("button 2");
            setAnswers("final", "final", "final", "final"); 
        }
        if(e.getSource() == buttons[2]){
            setQuestion("button 3");
        }
        if(e.getSource() == buttons[3]){
            setQuestion("button 4");
        }

        if(e.getSource()==startGame){
            cl.show(panelCont, "2");

        }


    }
    public void addAll(){

        panelGame.add(buttons[0]);
        panelGame.add(buttons[1]);
        panelGame.add(buttons[2]);
        panelGame.add(buttons[3]);
        panelGame.add(question);
        panelStartScreen.add(startGame);



    }



    public static void setAnswers( String ans1, String ans2, String ans3,String ans4){
        buttons[0].setText("Answer 1 : " + ans1);
        buttons[1].setText("Answer 2 : " + ans2);
        buttons[2].setText("Answer 3 : " + ans3);
        buttons[3].setText("Answer 4 : " + ans4);

    }

    public static void setQuestion(String q){
        question.setText("Question: " + q);
    }
}

【问题讨论】:

标签: java swing jcomponent cardlayout


【解决方案1】:

注意事项:

1. 调用 JFrame.pack() 重新排列其组件并调整 JFrame 的大小。

2. 制作 JPanel 更容易(我发现),调用 JPanel.setPreferredSize(new Dimension(width, height)),在其中放置组件,然后将其添加到 JFrame。这样,您仍然可以调用 JFrame.pack() 并且 JPanel 保持其首选大小。

3. 您可以删除 JFrame.pack(),调用 JFrame.setPreferredSize(new Dimension(width, height)) 和/或 JFrame.setResizable(false)。

4. 你可以调用 JFrame.setMinimumSize(new Dimension(width, height)) 来防止它打包得太紧。请注意,当您调用 JFrame.pack() 时,此方法不会保证指定的尺寸。在您的情况下,由于之后调用 JFrame.pack() ,宽度会有所延长。

5. 对于您的程序,我建议您使用 JFrame.setLayout(new BorderLayout()),并使用 FlowLayout/GridLayout 制作一个 JPanel 并添加您的按钮。然后将 JPanel 放在 BorderLayout.NORTH 区域。然后创建另一个 JPanel,使用您选择的布局将您的问题放入其中,并将其添加到 JFrame 中的 BorderLayout.CENTER 区域。记下不影响组件可见性的最小尺寸后,配置 JFrame.setMinimumSize(new Dimension(width, height))。

6. 布局管理器在调整窗口大小后摆脱了与组件放置有关的所有麻烦,但在极少数情况下确实存在使用 setLayout(null) 是最佳选择的情况(见图 1)。如果您不关心用户调整应用程序大小的能力,调用 JFrame.setResizable(false) 就足够了。但是,这会导致与分辨率较低的显示器的兼容性问题。

图 1. 以这种方式放置按钮需要我放弃布局管理器并根据调整窗口大小时更新的宽度和高度变量来配置这些按钮的放置。

祝你好运!

【讨论】:

  • 谢谢,这很有帮助。
猜你喜欢
  • 2011-08-06
  • 2018-03-02
  • 1970-01-01
  • 2016-06-26
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
  • 2022-01-18
  • 2012-01-12
相关资源
最近更新 更多