如何设置卡片布局的位置和大小?
How can set location and size for card layout?
我一直在做这个小问答游戏作为一个让我忙碌的项目,但我不知道如何让它看起来更好。最好是,按钮位于顶部,问题位于底部,大小设置为 window。尽管 setSize() 或 setPreferredSize() 不起作用。所以 window 非常细,按钮和问题都在顶部。
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);
}
}
注意事项:
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)),and/or 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. 布局管理器在调整 window 的大小后摆脱了与组件放置有关的所有麻烦,但确实存在使用 setLayout(null) 是最佳选择的极少数情况(见图 1)。如果您不关心用户调整应用大小的能力,调用 JFrame.setResizable(false) 就足够了。然而,这将导致与较低分辨率显示器的兼容性问题。
图 1. 以这种方式放置按钮要求我放弃布局管理器并根据在调整 window.
大小时更新的宽度和高度变量配置这些按钮的位置
祝你好运!
我一直在做这个小问答游戏作为一个让我忙碌的项目,但我不知道如何让它看起来更好。最好是,按钮位于顶部,问题位于底部,大小设置为 window。尽管 setSize() 或 setPreferredSize() 不起作用。所以 window 非常细,按钮和问题都在顶部。
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);
}
}
注意事项:
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)),and/or 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. 布局管理器在调整 window 的大小后摆脱了与组件放置有关的所有麻烦,但确实存在使用 setLayout(null) 是最佳选择的极少数情况(见图 1)。如果您不关心用户调整应用大小的能力,调用 JFrame.setResizable(false) 就足够了。然而,这将导致与较低分辨率显示器的兼容性问题。
祝你好运!